2017-04-16 33 views
0

手頭上有以下輸入數據[-5, 10,2], [-2, -3,3], [-4, -9,1], [7, 11,-3], [12, 6,-1], [13, 4,5],並且想要使用PCA將3D陣列轉換爲1D陣列。我輸入下面的代碼:主分量分析使用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做覈查。

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) 

結果從sklearn

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

這似乎給出了正確的結果。