Scikit-Learn 中的累积分布函数 (CDF)?
Cumulative Distribution Function (CDF) in Scikit-Learn?
我通过scikit-learn获得我的SPS(太阳能发电站)发电的GMM模型并搜索概率密度函数(PDF,黑线):
但我想要一个概率函数(CDF 或累积分布函数)。换句话说,我想得到一个像例子这样的函数:
可以接收 y 轴上 [0, 1] 范围内的值并在所有 x-axis 上增长。 scikit-learn允许还是不允许?
假设您做过这样的事情:
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');
我通过scikit-learn获得我的SPS(太阳能发电站)发电的GMM模型并搜索概率密度函数(PDF,黑线):
但我想要一个概率函数(CDF 或累积分布函数)。换句话说,我想得到一个像例子这样的函数:
可以接收 y 轴上 [0, 1] 范围内的值并在所有 x-axis 上增长。 scikit-learn允许还是不允许?
假设您做过这样的事情:
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');