scipy.stats.kde以及scipy.stats.kstes

2024-04-20 09:09:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我如何以共形方式使用scipy.stats.kde.gaussian_kde和{}?在

例如,代码:

from numpy import inf
import scipy.stat
my_pdf = scipy.stats.kde.gaussian_kde(sample)
scipy.stats.kstest(sample, lambda x: my_pdf.integrate_box_1d(-inf, x))

给出以下答案: (0.5396735893479544, 0.0)

这是不正确的,因为一个样本显然属于构建在这个样本上的分布。在


Tags: sample代码fromimportnumpypdfmystats
1条回答
网友
1楼 · 发布于 2024-04-20 09:09:43

首先,如果两个样本可能来自同一分布,正确的测试方法是two-sample KS test,在{a2}中实现,它直接比较经验cdf。KDE是一种密度的估计,它可以平滑CDF,因此从统计学上讲,这是一堆不必要的工作,也会使你的估计变得更糟。在

但您看到这个问题的原因是CDF参数的签名不太正确。kstest调用cdf(vals)(source),其中vals是已排序的样本,以获得每个样本的CDF值。在您的代码中,这最后调用了my_pdf.integrate_box_1d(-np.inf, samps),但是integrate_box_1d希望这两个参数都是标量。签名是错误的,如果您在大多数数组中尝试此操作,它将以ValueError崩溃:

>>> my_pdf.integrate_box_1d(-np.inf, samp[:10])
                                     -
ValueError                                Traceback (most recent call last)
<ipython-input-38-81d0253a33bf> in <module>()
  > 1 my_pdf.integrate_box_1d(-np.inf, samp[:10])

/Library/Python/2.7/site-packages/scipy-0.12.0.dev_ddd617d_20120725-py2.7-macosx-10.8-x86_64.egg/scipy/stats/kde.pyc in integrate_box_1d(self, low, high)
    311 
    312         normalized_low = ravel((low - self.dataset) / stdev)
 > 313         normalized_high = ravel((high - self.dataset) / stdev)
    314 
    315         value = np.mean(special.ndtr(normalized_high) - \

ValueError: operands could not be broadcast together with shapes (10) (1,1000) 

但不幸的是,当第二个参数是samp时,它可以很好地广播,因为数组是相同的形状,然后一切都会变糟。假定integrate_box_1d应该检查其参数的形状,但有一种方法可以正确地执行此操作:

^{pr2}$

如果您喜欢,也可以使用^{}。在

(但是,您可能确实想使用ks_2samp。)

相关问题 更多 >