使用numpy和R计算标准差得到不同的结果

5
当我尝试使用numpy和R计算标准差时,得到了两个不同的结果。可能是我遗漏了一些愚蠢的东西,但是是什么呢?
R代码
x1=matrix(c(1,7,5,8,9,5,4,5,4,3,76,8),nrow=4)
std=sd(x1[,1])
mean=mean(x1[,1])
std=apply(X=x1,MARGIN=2,FUN=sd)
std



> x1=matrix(c(1,7,5,8,9,5,4,5,4,3,76,8),nrow=4)
> std=sd(x1[,1])
> std=apply(X=x1,MARGIN=2,FUN=sd)
> std
[1]  3.095696  2.217356 35.565667

Python 代码

import numpy as np

x1=np.matrix([[1.,9.,4.],[7.,5.,3.],[5.,4.,76.],[8.,5.,8.]])
std=np.apply_along_axis(func1d=np.std,axis=0,arr=x1)


std
Out[9]: array([  2.68095132,   1.92028644,  30.80077109])
3个回答

13

为了以后的搜索,R使用N-1作为分母计算标准差,而numpy使用N。为了得到相同的结果,请尝试设置ddof(即"delta自由度")。

x1.std(axis=0, ddof=1)

请注意,您可以通过使用不同的符号来节省大量无用信息:

In [33]: x1.std(axis=0)
Out[33]: matrix([[  2.68095132,   1.92028644,  30.80077109]])

In [34]: x1.std(axis=0, ddof=1)
Out[34]: matrix([[  3.09569594,   2.21735578,  35.56566697]])

你知道是否有任何一种sklearn.preprocessing.scale(x1)的变体,以便使用R标准差的相同定义来缩放数据吗? - Donbeo

5

4

默认情况下,R在计算标准差时由于均值的计算会减去一个自由度。

对应于R代码的NumPy代码如下:

np.std(x1, axis = 0, ddof = 1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接