2017-04-16 15 views
0

次の入力データ[-5, 10,2], [-2, -3,3], [-4, -9,1], [7, 11,-3], [12, 6,-1], [13, 4,5]があり、3D配列から1D配列に変換するためにPCAを使用したいと考えています。私は次のコードを入力しました:主成分分析は、Pythonを使用して3d配列を1d配列に変換します

import numpy as np 
input = np.array([[-5, 10,2], [-2, -3,3], [-4, -9,1], [7, 11,-3], [12, 6,-1], [13, 4,5]]) 
mean_x = np.mean(input[0,:]) 
mean_y = np.mean(input[1,:]) 
mean_z = np.mean(input[2,:]) 
scaled_vector = np.array([input[0,:]-[mean_x],input[1,:]-[mean_y],input[2,:]-[mean_z]]) 
data=np.vstack((scaled_vector)).T 
scatter_matrix=np.dot(np.transpose(data),data) 
eig_val, eig_vec = np.linalg.eig(scatter_matrix) 
eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(len(eig_val))] 
eig_pairs.sort(reverse=True) 
feature=eig_pairs[0][1][2] 
new_data_reduced=np.dot(data,np.transpose(feature)) 
print(new_data_reduced) 

私もsklearn.decomposition import PCAを使って検証します。 sklearnから

import numpy as np 
from sklearn.decomposition import PCA 
X = np.array([[-5, 10,2], [-2, -3,3], [-4, -9,1], [7, 11,-3], [12, 6,-1], [13, 4,5]]) 
pca = PCA(n_components=1) 
pca.componrnt = True 
newX = pca.fit_transform(X) 
print (newX) 

の結果は、これが正しいかではない結果ならば、私はわからない

[[ 1.81922968] 
[ 8.34080915] 
[ 13.64517202] 
[ -8.17114609] 
[ -8.37254693] 
[ -7.26151783]] 

です。しかし、私自身のPCAを使用すると、結果は非常に異なることがわかります。したがって、どうすれば修正できますか?

答えて

0

最初に、列の代わりに行に沿って平均を減算します。次に、固有ベクトルを計算した後、PCAには不要ないくつかのステップを実行します。コードの縮小バージョンは、

import numpy as np 
    input = np.array([[-5, 10,2], [-2, -3,3], [-4, -9,1], 
         [7, 11,-3], [12, 6,-1], [13, 4,5]]) 
    data = input - np.mean(input, axis=0) 
    scatter_matrix = np.dot(data, data.T) 
    eig_val, eig_vec = np.linalg.eig(scatter_matrix) 
    new_reduced_data = np.sqrt(eig_val[0]) * eig_vec.T[0].reshape(-1,1) 
    print(new_reduced_data) 

です。正しい結果が得られているようです。

関連する問題