gpt4 book ai didi

python - 如何访问 sklearn 的 KDE 参数以进行 scipy 的 Kolmogorov-Smirnov 测试?

转载 作者:太空宇宙 更新时间:2023-11-03 21:40:06 25 4
gpt4 key购买 nike

我有一个一维离散数据集。在此集合上,我想使用 sklearn 的内置函数执行核密度估计:

from sklearn.neighbors.kde import KernelDensity

data = ... # array of shape [5000, 1]

## perform kde with gaussian kernels
kde = KernelDensity(kernel='gaussian', bandwidth=0.8).fit(data.reshape(-1, 1))

在 kde 实例方法 score_samples 的帮助下,我能够绘制出底层密度函数的合理估计:

pdf created with kde

## code for plot
X_plot = np.linspace(-5, 100, 10000)[:, np.newaxis]
log_dens = kde.score_samples(X_plot)

plt.plot(X_plot[:, 0], np.exp(log_dens))

我想使用这个分布来执行单样本 KS 测试。我发现scipy已经实现了这个功能。查看文档here 。它说:

scipy.stats.kstest(rvs, cdf, args=(), N=20, alternative='two-sided', mode='approx')

rvs : str, array or callable

If a string, it should be the name of a distribution in scipy.stats.If an array, it should be a 1-D array of observations of randomvariables. If a callable, it should be a function to generate randomvariables; it is required to have a keyword argument size.

cdf : str or callable

If a string, it should be the name of a distribution in scipy.stats. If rvs is a string then cdf can be False or the same asrvs. If a callable, that callable is used to calculate the cdf.

基本上,rvs 是新的样本数据,cdf 是累积分布函数(pdf 的积分)。我无法找到如何访问 sklearn 中计算 pdf 的函数,以便我可以将其集成并将其提供给 kstest。

有人知道如何到达那里吗?另外,如果此方法有任何替代方法,请告诉我。

最佳答案

您可以简单地集成score_samples来获取cdf。 scipy.integrate.quad可能会起作用。

** 编辑 ** 似乎 score_samples 是对数密度,但是当未记录时积分为 1。不过确实需要一些 reshape ,不幸的是 scipy 积分边界不接受数组。

def cdf(y):
return functools.partial(
scipy.integrate.quad,
lambda x: np.exp(kde.score_samples(np.array([x]).reshape(-1,1)))[0],
-np.inf
)(y)[0]

def array_cdf(X):
return np.array(list(map(cdf, X)))

scipy.stats.kstest(data, array_cdf)

关于python - 如何访问 sklearn 的 KDE 参数以进行 scipy 的 Kolmogorov-Smirnov 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52928204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com