我有一个大小为 (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。当我看到异常高的数字时,我会过滤掉整行。以下直方图显示了我的实际分布情况:
最佳答案
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)
关于python - 如何计算一个数字与均值的标准差是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28409064/