2010-12-28 21 views
16

Temel olarak, bir matrisi alın ve değişkeni 0'a eşit olacak şekilde değiştirin ve varyans 1 olsun. Numpy dizilerini kullanıyorum, bu yüzden zaten yapabilirse daha iyi olabilir, ancak elimden gelenin en iyisini yapabilirim. bir algoritma bulmak.Matrisi nasıl standart hale getirebilirim?

düzenleme: nvm nimrodm

+1

"değişim" tanımlayın. Ya, biz matrisi sadece kimlik matrisi ile değiştirirsek ne olur? Ne tür dönüşümler iyi? –

+0

Sadece meraktan dolayı, neden bunu yapmak zorundasınız? –

+0

Bu işlemin ara adımlarda gerçekleştirilmesini isteyen bir bilgisayar görme algoritması uygulamaya çalışıyorum. Bence bu PCA için bir zorunluluk çünkü emin değilim. – pnodbnda

cevap

0

her eleman alın ve ortalama çıkarma ve sonra standart sapma bölün daha iyi bir uygulama vardır.

Vur beni, python'u bilmiyorum. Genel olarak, yukarıdaki

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

Not: Bu işe yarayacak, ancak büyük matrisler için yavaş olacak. @ nimrodm'un cevabı, numpy'nin optimizasyonlarından yararlanacağı için çok daha hızlı olacaktır. –

+2

Evet, lütfen 'Numpy' kullanın. Sadece "teoride" nasıl normalleştirmeyi göstermek istedim. – ja72

47

aşağıdaki (yeni ortalama 0 olduğu), daha sonra standart sapma ile sonucu normalleştirir her elemanından bir ortalamasını çıkarır olup.

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

bir sayıda boyutlara sahipse, yukarıda, bir bütün olarak tüm matris standartlaştırılması için ise ve axis belirtin tek tek her sütun standardize etmek istiyorum: elle doğrulamak Daima

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

Ya bu Tek linerler onları kodunuza entegre etmeden önce yapıyorlar. Yönelimdeki veya boyuttaki basit bir değişiklik, hangi işlemlerin kendiliğinden gerçekleştiğini (sessizce) büyük ölçüde değiştirebilir.

+0

'A' sadece 'std (A)> 0' ile sıfıra bölünmeyi önlemek ve 'NaN' değerleri –

+0

'u güncellemek isteyebilirsiniz. Bu, A'nın bir liste listesi olarak gösterilmesiyle mümkün mü? – Neamah

+0

@Neamah Neden sadece [convert] (http://stackoverflow.com/questions/10346336/list-of-lists-into-numpy-array) bir numpy dizisine? – 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) 

Örnek: iyi büyük veri kümeleri üzerinde

>>> 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]]) 

eserler.

+0

, backticks yerine her şeyi girmek için ctrl + k kullanabilirsiniz. –

1

sklearn.preprocessing.scale'u kullanın. İşte

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

bir örnektir.
>>> 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

İlgili konular