Principal Component Analysis使用Python将3d数组转换为1d数组

时间:2017-04-16 15:34:31

标签: python arrays pca

我手头有以下输入数据[-5, 10,2], [-2, -3,3], [-4, -9,1], [7, 11,-3], [12, 6,-1], [13, 4,5],并希望使用PCA将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时,我发现结果非常不同。因此,我该如何纠正呢?

1 个答案:

答案 0 :(得分: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)

似乎给出了正确的结果。