私は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()
私はこのグラフを得る:良いようです
。クラスはかなり異なっていますが、グラフは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列)を掛けるにはどうすればよいですか?私のコードには何か問題がありますが、私は正確に何を理解していません。
残念ながら。 ValueError:シェイプ(288,49152)と(2,288)が整列していない:49152(dim 1)!= 2(dim 0) ' –
OK try(X_t = standX.dot(matrix_w.T) 'standX.T.dot(matrix_w.T)';行列の乗算で「内部」の次元が一致する必要があります – maxymoo
とにかく努力していただきありがとうございます。しかしそれはうまくいかなかった。別のアプローチでコードを書き直すだけで解決しました。 –