如何检查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.kstesthttp://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中变量的分布? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查Objective C BOOL变量的真假[关闭]

如何在Python 3中检查给定数字是不是是阶乘[关闭]

如何在 Python 中打印变量? [关闭]

如何检查代码库是用哪个版本的 Python 编写的? [关闭]

C如何检查内存地址是不是仍在范围内[关闭]

如何在python中记住其他程序实例变量[关闭]