我尝试在Python中实现PCA。我的目标是创建一个行为类似于Matlab的PCA实现的版本。但是,我认为我错过了一个关键点,因为我的测试部分产生了带有错误符号(+/-)的结果。您能找到算法错误吗?为什么有时标志不同?基于特征向量的PCA的实现:new_array_rank=4A_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]])
1 回答
慕哥9229398
TA贡献1877条经验 获得超6个赞
特征向量的符号和其他归一化选择是任意的。Matlab和numpy以相同的方式对特征向量进行规范,但是符号是任意的,并且可能取决于所使用的线性代数库的细节。
当我编写matlab的princomp的numpy等价物时,我在将本征向量与matlab的本征向量进行比较时就将其归一化了。
添加回答
举报
0/150
提交
取消