python - 如何在python中返回通过sklearn的函数KernelDensity估计的分布的平均值(或期望值)?

标签 python scikit-learn statsmodels kernel-density

我的问题是,如何返回估计的“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)

最佳答案

一般来说,您需要通过数字来完成此操作。我建议两种不同的方法:

  • 集成
  • 蒙特卡罗模拟

这些方法适用于任何内核和任何带宽

集成

利用这样一个事实:一旦我们知道概率密度函数,我们就可以通过积分轻松计算均值和方差。

mean and variance

请注意,在 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/

相关文章:

python - 使用 pyBarcode 将数字放在条形码下方

python - 平方和的微小数值差异取决于所使用的 numpy 过程调用

regex - 如何设置 sklearn CountVectorizer 以包含非字母数字字符作为特征提取?

python - 无法运行keras

python - Pickle,读入数据,不支持的 pickle 协议(protocol) : 3 python 2. 7

python - scikit-学习 PCA : matrix transformation produces PC estimates with flipped signs

python - 语法在客户转换器上提取日,月,年的语法错误

python - StatsModels:返回没有截距的线性回归的预测区间

python - 无法根据规则 ('O' 将数组数据从 dtype ('float64' ) 转换为 dtype 'safe' )

python-3.x - 获取值错误 : The indices for endog and exog are not aligned