【问题标题】:Cumulative Distribution Function (CDF) in Scikit-Learn? [closed]Scikit-Learn 中的累积分布函数(CDF)? [关闭]
【发布时间】:2021-05-23 06:32:58
【问题描述】:

我通过 scikit-learn 和搜索概率密度函数(PDF,黑线)获得了我的 SPS(太阳能发电站)发电的 GMM 模型:

但我想要一个概率函数(CDF 或累积分布函数)。换句话说,我想得到一个像例子一样的函数:

可以接收范围为 [0, 1] 的轴 y 上的值,并在所有 x 轴上增长。 scikit-learn 是否允许?

【问题讨论】:

  • 不明白你的问题,你需要概率还是密度?
  • 我需要“累积概率函数”(CDF)(抱歉,在被问到问题时忘记了之前的定义)而不是“概率密度函数”(PDF)(这是两个不同的函数,具有不同的含义,因为我知道)

标签: python scikit-learn data-analysis


【解决方案1】:

假设你做了这样的事情:

import numpy as np
from sklearn.mixture import GaussianMixture

# create data
rng = np.random.RandomState(seed=42)
X = np.concatenate([rng.normal(0, 1, 100),
                    rng.normal(10, 3, 100),
                    rng.normal(30, 2, 100)]).reshape(-1, 1)

# estimate probability density function (pdf) 
model = GaussianMixture(n_components=2)
model.fit(X) 
x = np.linspace(-10, 40, 1000)
logprob = model.score_samples(x.reshape(-1, 1))
pdf = np.exp(logprob)

然后你可以通过简单地对估计的密度值取累积和,并对其进行缩放以使最大值为 1 来获得累积分布函数:

import matplotlib.pyplot as plt

# derive cumulative distribution function (cdf)
cdf = np.cumsum(pdf)
# scale as a probability distribution
cdf = cdf / np.max(cdf)

# plot data and pdf  
plt.hist(X, 25, density=True, histtype='stepfilled', alpha=0.3)
plt.plot(x, pdf, '-k')

# plot cdf, scaled to the y limits of the above plot
xmin, xmax, ymin, ymax = plt.axis()
plt.plot(x, cdf * ymax, '-b');

【讨论】:

  • 真的很有效)谢谢你)