【问题标题】:How to access sklearn's KDE params for scipy's Kolmogorov-Smirnov test?如何访问 sklearn KDE 参数以进行 scipy Kolmogorov-Smirnov 测试?
【发布时间】:2019-03-26 11:04:08
【问题描述】:

我有一个一维离散数据集。在这个集合上,我想用 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 的帮助下,我能够绘制出对底层密度函数的合理估计:

## 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

如果是字符串,它应该是 scipy.stats 中的分布名称。 如果是一个数组,它应该是一个随机观察的一维数组 变量。如果是可调用的,它应该是一个生成随机数的函数 变量;它需要有一个关键字参数大小。

cdf : str 或可调用

如果是字符串,它应该是 scipy.stats 中的分布名称。如果 rvs 是一个字符串,则 cdf 可以为 False 或与 房车如果是可调用对象,则使用该可调用对象来计算 cdf。

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

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

【问题讨论】:

  • KDE 是一种估计某些数据的 pdf 的方法。根据文档,score_samples 方法评估对数密度,它们表示 pdf 的对数。

标签: python scikit-learn scipy kernel-density kolmogorov-smirnov


【解决方案1】:

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

** 编辑 ** 似乎score_samples 是日志密度,但是当未记录时集成为 1。虽然需要一些重塑,不幸的是 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)

【讨论】:

  • 感谢您的回答,但score_samples 只是在某些点评估隐藏估计的功能。我不确定这是否是可以集成的有效功能。为了更清楚,我已经编辑了我的问题。
  • 到底有没有定义x?如果是这样,它可以被集成。
猜你喜欢
  • 2011-12-15
  • 2018-06-01
  • 2012-06-08
  • 2016-10-04
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多