Python 标准偏差
我试图计算一些分布的标准偏差,并从两条路径得到两个不同的结果。这对我来说没有多大意义-有人能解释一下为什么会发生这种情况吗Python 标准偏差,python,scipy,Python,Scipy,我试图计算一些分布的标准偏差,并从两条路径得到两个不同的结果。这对我来说没有多大意义-有人能解释一下为什么会发生这种情况吗 scipy.stats.binom(189, 100/189).std() 6.8622115305451707 scipy.stats.tstd([1]*100 + [0]*89) 0.50047821327986164 为什么这两个数字不相等?最基本的原因是,这里取的是两个完全不同事物的标准差。我认为你误解了scipy.stats.binom的功能。发件人: bin
scipy.stats.binom(189, 100/189).std()
6.8622115305451707
scipy.stats.tstd([1]*100 + [0]*89)
0.50047821327986164
为什么这两个数字不相等?最基本的原因是,这里取的是两个完全不同事物的标准差。我认为你误解了scipy.stats.binom的功能。发件人: binom的概率质量函数为:
binom.pmf(k)=选择(n,k)*p**k*(1-p)**(n-k)
对于{0,1,…,n}中的k
binom将n和p作为形状参数
当您执行binom(189100/189)
时,您正在创建一个可以接受0到189之间任何值的分发。毫不奇怪,此分布的方差比您正在使用的其他样本数据大得多,这些样本数据的值限制为零或一
看起来您想要的是scipy.stats.binom(1100/189.std()
。但是,您仍然不能期望得到与样本数据完全相同的值,因为binom.std
正在计算总体分布的标准偏差,而另一个版本(scipy.stats.tstd([1]*100+[0]*89)
)只计算样本的标准偏差。如果增加样本的大小(例如,doscipy.stats.tstd([1]*1000+[0]*890)
),样本标准偏差将接近从binom.std
获得的值
您还可以使用
scipy.std
或numpy.std
而不是scipy.stats.tstd
来获取总体(非样本)stdscipy.stats.tstd
没有用于选择自由度的ddof
选项,并且始终计算有意义的样本std
。有没有办法在不创建值的情况下获得与tstd相同的值?从我读到的内容来看,结果应该与scipy.stats.binom(1100/189).std()相关,如果是这样的话…@viraptor:请参阅我编辑过的答案。你不能得到完全相同的值,因为在一种情况下,你计算的是“真实”分布std,而在另一种情况下,你只能得到一个小样本的std。但是如果你增加样本量,这些值会越来越接近。@BrenBarn:我不确定你的“真实”与“样本”论点是否正确。这真的只是个自由度的问题<代码>scipy.stats.binom(1100./189).std()==0.49915244084955573==numpy.std([1]*100+[0]*89)。OTOH,scipy.stats.tstd([1]*100+[0]*89)==0.50047821327986164==numpy.std([1]*100+[0]*89,ddof=1)
@DSM:是的,这就是我的意思,但你是对的,我没有说清楚。我的意思是,tstd
正在计算样本(而非总体)std。我编辑了我的答案,以包含一些关于这方面的信息,并提到scipy.std
,作为替代。我认为这样读起来更好。否则,听起来我们不希望结果完全相同,除非是在大样本范围内。不幸的是,我已经给了你+1,所以我不能再这样做了。^)