我的问题是,如何返回估计的“kde”的平均值和方差?或者您知道是否有任何其他软件包可以轻松输出平均值或方差值,例如 print kde.mean() 或 print kde.get_parameter(mean) ? p>
import numpy as np
from scipy.stats import norm
from sklearn.neighbors import KernelDensity
N = 100
np.random.seed(1)
X = np.concatenate((np.random.normal(0, 1, int(0.3 * N)),np.random.normal(5, 1, int(0.7 * N))))[:, np.newaxis]
X_plot = np.linspace(-5, 10, 1000)[:, np.newaxis]
kde = KernelDensity(kernel='gaussian', bandwidth=0.5).fit(X)
最佳答案
一般来说,您需要通过数字来完成此操作。我建议两种不同的方法:
- 集成
- 蒙特卡罗模拟
这些方法适用于任何内核和任何带宽。
集成
利用这样一个事实:一旦我们知道概率密度函数,我们就可以通过积分轻松计算均值和方差。
请注意,在 scikit-learn
中,方法 score_samples
返回 log pdf,因此需要对其进行“exp”。
蒙特卡罗模拟
这里的想法是简单地从 KDE 中进行采样,并通过样本均值和方差来估计总体均值和方差。
<小时/>代码
import numpy as np
from scipy.integrate import quad
from sklearn.neighbors import KernelDensity
N = 100
np.random.seed(1)
X = np.concatenate((np.random.normal(0, 1, int(0.3 * N)),np.random.normal(5, 1, int(0.7 * N))))[:, np.newaxis]
X_plot = np.linspace(-5, 10, 1000)[:, np.newaxis]
kde = KernelDensity(kernel='gaussian', bandwidth=0.5).fit(X)
# Mean and Variance - Integration
pdf = lambda x : np.exp(kde.score_samples([[x]]))[0]
mean_integration = quad(lambda x: x * pdf(x), a=-np.inf, b=np.inf)[0]
variance_integration = quad(lambda x: (x ** 2) * pdf(x), a=-np.inf, b=np.inf)[0] - mean_integration ** 2
# Mean and Variance - Monte Carlo
n_samples = 10000000
samples = kde.sample(n_samples)
mean_mc = samples.mean()
variance_mc = samples.var()
print('Mean:\nIntegration: {}\nMonte Carlo: {}\n'.format(mean_integration, mean_mc))
print('Variance\nIntegration: {}\nMonte Carlo: {}\n'.format(variance_integration, variance_mc))
输出:
Mean: Integration: 3.560582852075697 Monte Carlo: 3.5595633705830934
Variance: Integration: 6.645066811078639 Monte Carlo: 6.646732489654485
关于python - 如何在python中返回通过sklearn的函数KernelDensity估计的分布的平均值(或期望值)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55788868/