在Python中实现PCA(基于特征向量)

我尝试在Python中实现PCA。我的目标是创建一个行为类似于Matlab的PCA实现的版本。但是,我认为我错过了一个关键点,因为我的测试部分产生了带有错误符号(+/-)的结果。


您能找到算法错误吗?为什么有时标志不同?


基于特征向量的PCA的实现:


new_array_rank=4

A_mean = np.mean(A, axis=0)    

A = A - A_mean    


covariance_matrix = np.cov(A.T)    


eigen_values, eigen_vectors = np.linalg.eig(covariance_matrix)

new_index = np.argsort(eigen_values)[::-1]

eigen_vectors = eigen_vectors[:,new_index]

eigen_values = eigen_values[new_index]


eigen_vectors = eigen_vectors[:,:new_array_rank]

return np.dot(eigen_vectors.T, A.T).T

我的测试值:


array([[ 0.13298325,  0.2896928 ,  0.53589224,  0.58164269,  0.66202221,

     0.95414116,  0.03040784,  0.26290471,  0.40823539,  0.37783385],

   [ 0.90521267,  0.86275498,  0.52696221,  0.15243867,  0.20894357,

     0.19900414,  0.50607341,  0.53995902,  0.32014539,  0.98744942],

   [ 0.87689087,  0.04307512,  0.45065793,  0.29415066,  0.04908066,

     0.98635538,  0.52091338,  0.76291385,  0.97213094,  0.48815925],

   [ 0.75136801,  0.85946751,  0.10508436,  0.04656418,  0.08164919,

     0.88129981,  0.39666754,  0.86325704,  0.56718669,  0.76346602],

   [ 0.93319721,  0.5897521 ,  0.75065047,  0.63916306,  0.78810679,

     0.92909485,  0.23751963,  0.87552313,  0.37663086,  0.69010429],

   [ 0.53189229,  0.68984247,  0.46164066,  0.29953259,  0.10826334,

     0.47944168,  0.93935082,  0.40331874,  0.18541041,  0.35594587],

   [ 0.36399075,  0.00698617,  0.61030608,  0.51136309,  0.54185601,

     0.81383604,  0.50003674,  0.75414875,  0.54689801,  0.9957493 ],

   [ 0.27815017,  0.65417397,  0.57207255,  0.54388744,  0.89128334,

     0.3512483 ,  0.94441934,  0.05305929,  0.77389942,  0.93125228],

   [ 0.80409485,  0.2749575 ,  0.22270875,  0.91869706,  0.54683128,

     0.61501493,  0.7830902 ,  0.72055598,  0.09363186,  0.05103846],

   [ 0.12357816,  0.29758902,  0.87807485,  0.94348706,  0.60896429,

     0.33899019,  0.36310027,  0.02380186,  0.67207071,  0.28638936]])


富国沪深
浏览 309回答 1
1回答

慕哥9229398

特征向量的符号和其他归一化选择是任意的。Matlab和numpy以相同的方式对特征向量进行规范,但是符号是任意的,并且可能取决于所使用的线性代数库的细节。当我编写matlab的princomp的numpy等价物时,我在将本征向量与matlab的本征向量进行比较时就将其归一化了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python