web-dev-qa-db-ja.com

マトリックスを標準化するにはどうすればよいですか?

基本的に、行列を取り、その平均が0になり、分散が1になるように変更します。私はnumpyの配列を使用しているので、それがすでに可能であれば、それはより良いですが、見つけることができる限り、自分で実装できますアルゴリズム。

編集:nvm nimrodmの実装が改善されました

20
pnodbnda

以下は、各要素から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がそれらに対して実行する操作を(サイレントに)劇的に変更する可能性があります。

62
nimrodm
import scipy.stats as ss

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

大規模なデータセットでうまく機能します。

4
DoesData

使用する 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

1
Yuya Takashina
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