如何计算一个数字与平均值有多少标准偏差?

时间:2015-02-09 11:48:03

标签: python arrays numpy scikit-learn standard-deviation

我有一个大小的矩阵(61964,25)。这是一个示例:

array([[  1.,   0.,   0.,   4.,   0.,   1.,   0.,   0.,   0.,   0.,   3.,
          0.,   2.,   1.,   0.,   0.,   3.,   0.,   3.,   0.,  14.,   0.,
          2.,   0.,   4.],
       [  0.,   0.,   0.,   1.,   2.,   0.,   0.,   0.,   0.,   0.,   1.,
          0.,   2.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   5.,   0.,
          0.,   0.,   1.]])

Scikit-learn提供了一个有用的功能,只要我们的数据是正态分布的:

from sklearn import preprocessing

X_2 = preprocessing.scale(X[:, :3])

然而,我的问题是我必须以行为基础进行工作 - 它不仅包含25个观察值 - 因此正态分布在此处不适用。解决方案是使用t-distribution,但我怎么能在Python中做到这一点?

通常,值从0到20,比方说,20。当我看到非常高的数字时,我会过滤掉整行。以下直方图显示了我的实际分布情况:

enter image description here

1 个答案:

答案 0 :(得分:3)

scipy.stats具有zscore函数,可让您计算值高于均值的标准差数(通常称为标准分数 Z得分)。

如果arr是您问题中的示例数组,那么您可以计算每行25的Z分数,如下所示:

>>> import scipy.stats as stats
>>> stats.zscore(arr, axis=1)
array([[-0.18017365, -0.52666143, -0.52666143,  0.8592897 , -0.52666143,
        -0.18017365, -0.52666143, -0.52666143, -0.52666143, -0.52666143,
         0.51280192, -0.52666143,  0.16631414, -0.18017365, -0.52666143,
        -0.52666143,  0.51280192, -0.52666143,  0.51280192, -0.52666143,
         4.32416754, -0.52666143,  0.16631414, -0.52666143,  0.8592897 ],
       [-0.43643578, -0.43643578, -0.43643578,  0.47280543,  1.38204664,
        -0.43643578, -0.43643578, -0.43643578, -0.43643578, -0.43643578,
         0.47280543, -0.43643578,  1.38204664, -0.43643578, -0.43643578,
        -0.43643578, -0.43643578, -0.43643578, -0.43643578, -0.43643578,
         4.10977027, -0.43643578, -0.43643578, -0.43643578,  0.47280543]])

此计算使用每行的总体均值和标准差。要改为使用样本方差(与t统计量一样),另外指定ddof=1

stats.zscore(arr, axis=1, ddof=1)