如何检查python中变量的分布? [关闭]
Posted
技术标签:
【中文标题】如何检查python中变量的分布? [关闭]【英文标题】:How can check the distribution of a variable in python? [closed] 【发布时间】:2014-04-19 00:14:34 【问题描述】:在单元测试中,我需要检查数组的值分布是否均匀。例如:
在数组中 = [1, 0, 1, 0, 1, 1, 0, 0]
值是均匀分布的。由于有四个“1”和四个“0”
对于更大长度的数组,分布更“均匀”
如何证明正在测试的数组是均匀分布的?
注意:数组是用random.randint(min,max,len)
创建的,来自numpy.random
【问题讨论】:
是不知道如何判断一组值是否均匀分布的问题,还是无法在代码中实现? 没错,我不知道如何确定一组值(来自变量或数组)是否均匀分布。 这个问题似乎跑题了,因为它更适合stats.stackexchange.com 对于连续分布有Kolmogorov–Smirnov test;对于离散分布,有一个 Chi-square test @jonrsharpe,我不同意。问题是关于如何在Python
中做到这一点。如果问题出现在 stats.stackexchange.com 中,最有可能的回答是“对于 python 问题,请在 statoverflow 中向隔壁的 python 人员提问”。此外,如果您花一些时间在 stats.stackexchange.com 上,您会发现社区是面向数理统计的,而不是面向应用程序的。
【参考方案1】:
您可以将 Kolmogorove-Smirnov 检验用于连续 和 离散分布。该功能由scipy.stats.kstest
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kstest.html#scipy.stats.kstest提供。
In [12]:
import scipy.stats as ss
import numpy as np
In [14]:
A=np.random.randint(0,10,100)
In [16]:
ss.kstest(A, ss.randint.cdf, args=(0,10))
#args is a tuple containing the extra parameter required by ss.randint.cdf, in this case, lower bound and upper bound
Out[16]:
(0.12, 0.10331653831438881)
#This a tuple of two values; KS test statistic, either D, D+ or D-. and p-value
这里得到的 P 值为 0.1033,因此我们得出结论,数组A
与均匀分布没有显着差异。考虑 P 值的方法是,它测量在假设原假设为真的情况下,使检验统计量与观察到的一样极端的概率(这里:元组中的第一个数字)。在 KS 检验中,我们实际上有一个零假设,即A
与均匀分布没有区别。 0.1033 的 p 值通常被认为不足以拒绝零假设。通常 P 值必须小于 0.05 或 0.01 才能拒绝空值。如果这个例子中的这个 p 值小于 0.05,那么我们会说A
与均匀分布有很大的不同。
使用scipy.stats.chisquare()
的替代方法:
In [17]:
import scipy.stats as ss
import numpy as np
In [18]:
A=np.random.randint(0, 10, 100)
In [19]:
FRQ=(A==np.arange(10)[...,np.newaxis]).sum(axis=1)*1./A.size #generate the expect frequecy table.
In [20]:
ss.chisquare(FRQ) #If not specified, the default expected frequency is uniform across categories.
Out[20]:
(0.084000000000000019, 0.99999998822800984)
第一个值是卡方,第二个值是P值。
【讨论】:
即使在您链接到它的 scipy 页面上也写着:“KS 测试仅对连续分布有效。” @benhzad.nouri,如果我们要更深入地挖掘这个东西,我认为可以公平地说,如果对离散分布应用 KS 检验,则不能像连续分布那样估计 P分布(来自 D 统计量的分布)。你仍然可以通过模拟来做到这一点。见:cran.r-project.org/web/packages/dgof(实际上已经被提议回来了:oai.dtic.mil/oai/…)。当提供的cdf
是离散的时,我必须检查scipy.stats.kstest
的源代码以查看scipy
是否执行后者。
嗨@CTZhu,你能解释一下这条线是什么意思吗?
@CTZhu FRQ=(A==np.arange(10)[...,np.newaxis]).sum(axis=1)
,你需要频率以上是关于如何检查python中变量的分布? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章