Python中numpy与pandas标准差计算差异及ddof参数详解
本文详解Python中numpy和pandas计算标准差的区别。默认情况下,numpy.std()使用有偏估计(除以n),而pandas.std()使用无偏估计(除以n-1)。通过调整ddof参数,可实现两种算法的互换。文章指出ddof=1为无偏估计的关键,并提醒在scikit-learn等库中手动设置该参数的重要性,尤其在数据量较小时需特别注意。
numpy与pandas标准差默认行为对比
在使用numpy.std()计算标准差时,默认行为是除以样本数量n,这属于有偏估计。若需计算无偏样本标准差,必须显式添加参数ddof=1。
pandas.std()默认行为是除以n-1,即直接提供无偏估计。如果希望结果与numpy.std()保持一致(有偏估计),需设置参数ddof=0,即调用pandas.std(ddof=0)。此外,DataFrame的describe()方法中已内置包含std()函数。
具体代码示例如下:
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.std(a, ddof = 1)
3.0276503540974917
>>> np.sqrt(((a - np.mean(a)) ** 2).sum() / (a.size - 1))
3.0276503540974917
>>> np.sqrt(( a.var() * a.size) / (a.size - 1))
3.0276503540974917
numpy std函数的ddof参数陷阱
补充说明:numpy中标准差std函数容易产生的误区。
我们将Matlab作为对比基准进行标准差计算,结果如下:
>> std([1,2,3])
ans =
1
然而在numpy中执行相同操作时:
>>> np.std([1,2,3])
0.81649658092772603
为何会出现这种差异?原因在于np.std函数包含一个关键参数:
ddof : int, optional Means Delta Degrees of Freedom. The divisor used in calculations is N - ddof, where N represents the number of elements. By default ddof is zero.
因此,为了获得正确的无偏估计调用,必须将ddof设置为1:
>>> np.std([1,2,3], ddof=1)
1.0
对第三方库及小数据量的影响
此外,这一特性还会影响许多基于numpy构建的第三方库。例如scikit-learn中的StandardScaler。若要正确调用,用户需手动设置相关参数:
ss = StandardScaler()
ss.mean_ = np.mean(X, axis=0)
ss.scale_ = np.std(X, axis=0, ddof=1)
X_norm = ss.transform(X)
当数据量X较大时,这种差异影响不大;但当X数据量较小时,则需格外注意该参数的设置。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









