2016-10-18 5 views
1

私は4クラスの画像(クラスごとに.pngファイル72個)を持っており、それらのPCAを実行しています。データ。ここでは、コードです:今PCA in Python:scikit-learn対numpyのアプローチ

data_list = [] 

for file in fileList: # fileList contains the name of the 72x4 .png files 
    img_data = np.asarray(Image.open('C:\\Users\\Gian\\Desktop\\UNI\\' \ 
            'Sapienza\\Machine Learning\\Homeworks\\' \ 
            'First\\Data\\samples\\' + file)) # open image 
    x = img_data.ravel() # transform image into 49152-length vector 
    data_list.append(x) 

X = np.array(data_list) # create data matrix (72*4=288 rows by 49152 columns) 

、この時点で私はデータ行列にfit_transform関数を適用し、scikit-learnを使用します。

# Transform data on to new subspace and plot 
X_t = PCA(2).fit_transform(X) 
plt.scatter(X_t[0:72,0], X_t[0:72,1], c='y') 
plt.scatter(X_t[72:144,0], X_t[72:144,1], c='m') 
plt.scatter(X_t[144:216,0], X_t[144:216,1], c='r') 
plt.scatter(X_t[216:288,0], X_t[216:288,1], c='g') 
plt.show() 

私はこのグラフを得る:良いようです enter image description here 。クラスはかなり異なっていますが、グラフはy軸に関してミラーリングされている可能性があります(これについてはわかりません)。だから私は結果を二重にチェックすることにしました。私は、固有値と固有ベクトルをXの共分散行列を計算するために numpyを使用します。

covX = np.cov(X) 
eig_val, eig_vec = np.linalg.eig(covX) 

# make a list of (eig_val, eig_vec) tuples 
eig_pairs = [(np.abs(eig_val_cov[i]), eig_vec_cov[:,i]) for i in range(len(eig_val_cov))] 

# Sort the tuples from highest eigenvalue to lowest 
eig_pairs.sort(key=lambda x: x[0], reverse=True) 

私は最高の固有値(2つの主成分)を持つ2個の固有ベクトルを選択し、彼らとのマトリックスを作成します。

matrix_w = np.hstack((eig_pairs[0][1].reshape(288,1), eig_pairs[1][1].reshape(288,1))) # eigenvectors along columns 

さて、ここに問題があります。データ行列を新しい部分空間に変換する必要があります。だから、僕は計算:

standX = (X - mean(X))/std(X) # standardized data matrix (zero mean and unit variance) 
X_t = matrix_w.T.dot(standX) # transformed data matrix 

これは私が理解していないですものです:私はfit_transformを使用したときに、私は2列によって、288(=画像の数)行である変換行列X_tを得ました。今私のX_tは2行49152列です!彼らはなぜ異なっているのですか?私がfit_transformを使用したときのように、私は288x2 X_tを得るべきだったように感じますが、どうしたらいいか分かりません。 standX(288行×49152列)に固有ベクトル行列matrix_w.T(2行×288列)を掛けるにはどうすればよいですか?私のコードには何か問題がありますが、私は正確に何を理解していません。

答えて

0

行列の乗算が間違っている可能性があります。 X_t = standX.dot(matrix_w)のようなことをすればうまくいくのですか?

+0

残念ながら。 ValueError:シェイプ(288,49152)と(2,288)が整列していない:49152(dim 1)!= 2(dim 0) ' –

+1

OK try(X_t = standX.dot(matrix_w.T) 'standX.T.dot(matrix_w.T)';行列の乗算で「内部」の次元が一致する必要があります – maxymoo

+0

とにかく努力していただきありがとうございます。しかしそれはうまくいかなかった。別のアプローチでコードを書き直すだけで解決しました。 –