如何标准化矩阵?

时间:2010-12-28 07:07:09

标签: python algorithm math numpy

基本上,取一个矩阵并改变它,使其均值等于0,方差为1.我正在使用numpy的数组,所以如果它已经可以做到它更好,但我可以自己实现它,只要我可以找到算法。

编辑:nvm nimrodm有更好的实现

6 个答案:

答案 0 :(得分:61)

以下从每个元素中减去A的均值(新均值为0),然后将结果标准化为标准差。

from numpy import *
A = (A - mean(A)) / std(A)

以上是整个矩阵的标准化,如果A有多个维度,并且您希望单独标准化每个列,请指定axis

from numpy import *
A = (A - mean(A, axis=0)) / std(A, axis=0)

在将这些单行程序集成到代码中之前,请务必手动验证这些单行程序的作用。方向或维度的简单改变可以彻底改变(静默地)numpy对它们执行的操作。

答案 1 :(得分:9)

import scipy.stats as ss

A = np.array(ss.zscore(A))

答案 2 :(得分:4)

from sklearn.preprocessing import StandardScaler

standardized_data = StandardScaler().fit_transform(your_data)

示例:

>>> import numpy as np
>>> from sklearn.preprocessing import StandardScaler

>>> data = np.random.randint(25, size=(4, 4))
>>> data
array([[17, 12,  4, 17],
       [ 1, 16, 19,  1],
       [ 7,  8, 10,  4],
       [22,  4,  2,  8]])

>>> standardized_data = StandardScaler().fit_transform(data)
>>> standardized_data
array([[ 0.63812398,  0.4472136 , -0.718646  ,  1.57786412],
       [-1.30663482,  1.34164079,  1.55076242, -1.07959124],
       [-0.57735027, -0.4472136 ,  0.18911737, -0.58131836],
       [ 1.24586111, -1.34164079, -1.02123379,  0.08304548]])

适用于大型数据集。

答案 3 :(得分:1)

使用sklearn.preprocessing.scale

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html

这是一个例子。

>>> from sklearn import preprocessing
>>> import numpy as np
>>> X_train = np.array([[ 1., -1.,  2.],
...                     [ 2.,  0.,  0.],
...                     [ 0.,  1., -1.]])
>>> X_scaled = preprocessing.scale(X_train)
>>> X_scaled
array([[ 0.  ..., -1.22...,  1.33...],
       [ 1.22...,  0.  ..., -0.26...],
       [-1.22...,  1.22..., -1.06...]])

http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling

答案 4 :(得分:0)

import numpy as np

A = np.array([[1,2,6], [3000,1000,2000]]).T  

A_means = np.mean(A, axis=0)
A_centr = A - A_means
A_norms = np.linalg.norm(A_centr, axis=0)

A_std = A_centr / A_norms

答案 5 :(得分:-1)

取每个元素并用均值减去,然后除以标准差。

拍拍我,我不懂蟒蛇。一般来说,上面是

mu = Average()
sig = StandardDeviation()
for(i=0;i<rows;i++)
{
   for(j=0;j<cols;j++)
   {
       A[i,j] = (A[i,j]-mu)/sig;
   }
}