2010-12-28 6 views
16

基本的には、行列を取って、その平均が0で分散が1になるように変更します。私はnumpyの配列を使用しています。もしそれがすでにできていれば、それは良いですが、アルゴリズムを見つける。マトリックスを標準化するにはどうすればよいですか?

編集:NVM nimrodmより良い実装

+1

"変更" を定義します。たとえば、行列を単位行列などで置き換えるだけの場合はどうなりますか?どんな種類の変換がOKですか? –

+0

好奇心の理由から、なぜこれを行う必要がありますか? –

+0

私はこの操作を中間ステップで実行するように求めるコンピュータビジョンアルゴリズムを実装しようとしています。私はそれがPCAの要件だからだと思うが、わからない。 – pnodbnda

答えて

0

各要素を取り、平均と減算した後、標準偏差で除算しています。

私を撃って、私はpythonを知らない。一般に、上記

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

注:これは動作しますが、大きな行列の場合は遅くなります。 @ nimrodmの答えは、numpyの最適化の恩恵を受けるため、はるかに高速になります。 –

+2

はい、「ナンシー」を使用してください。私はちょうど "理論的に"正規化する方法を示したかった。 – ja72

47

次の(新しい平均が0である)、次いで、標準偏差によって結果を正規化し、各素子からのAの平均値を減算します。 Aは、多くの次元を持って、あなたは、個別に各列を標準化axisを指定したい場合は

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

以上、全体として行列全体を標準化するためのものです:

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

は必ず手で何これらを検証しますワンライナーはコードに組み込む前にやっています。単純な方向または次元の変更は、numpyが実行する操作を大幅に変更(サイレント)することができます。

+0

0とNaNの値による除算を避けるために 'std(A)> 0'を' A'だけ更新したい場合があります。 –

+0

Aはリストのリストとして表現できますか? – Neamah

+0

@Neamahどうしてnumpyの配列に変換するだけでいいのですか?(http://stackoverflow.com/questions/10346336/list-of-lists-into-numpy-array) – kingledion

6
import scipy.stats as ss 

A = np.array(ss.zscore(A)) 
3
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]]) 

が大規模なデータセットに適しています。

+0

あなたはbackticksの代わりにすべてをインデントするためにCtrl + Kを使うことができます。 –

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

関連する問題