原文:/leonwen/p/5158947.html
该算法由MatLab移植而来(具体参见上一篇博文)。但是最终输出结果却和MatLab不一致,经排查发现在进行调用两者内部函数eig进行求解特征值和特征向量的时候,两者特征值都一致,但是特征向量却不同。
可是,从理论上感觉也说得过去,因为特征向量本来就具有不唯一性。最让人费解的是,就算两者特征向量不一致,可为什么使用PCA的结果却反差很大呢?感觉上来看,好像是Python的不准确性更大一点。
代码如下:
# -*- coding: utf-8 -*-"""Created on Tue Jan 12 21:45:57
@author: LeonWen"""import osfrom PIL import Imagefrom numpy import *from pylab import *path = r'D:\Projects\PythonProj\ImageProcessing\'sst_dir = os.listdir(path)file_len = len(sst_dir)sst_list = []for i in range(file_len):str = path + '\\' + sst_dir[i]#txt = open(str).read() sst_list.append(str)immatrix = []for im in sst_list:text = loadtxt(im) immatrix.append(text)immatrix = array(immatrix)# 显示输出figure()gray()for i in range(file_len):subplot(3,4,i + 1)pic = immatrix[i].reshape(180,360)pic = pic[::-1]# picshow = rot90(pic,4) imshow(pic)colorbar()show()# 转换成样本总体X = immatrix.T# 获取要本大小m,n = X.shape[0:2]# 取得各个样本均值meanVal = mean(X,axis = 0)#tempMean = tile(meanVal,(64800,1))# 样本矩阵去中心化X = X - tile(meanVal,(64800,1))# 计算协方差S = dot(X.T,X) / (m - 1)# 计算特征值eg和特征向量Eveg,Ev = linalg.eig(S)#eg1,Ev1 = linalg.eigh(S) # 这两种算法存在排序区别,eigh返回结果由小到大# 计算新的成分Y = dot(immatrix.T,Ev)figure()gray()for i in range(n):subplot(3,4,i + 1)out = Y[:,i] outpic = out.reshape(180,360)outpic = outpic[::-1] imshow(outpic) colorbar()show()
结果显示:
原始数据显示
PCA主成分分析结果输出
可能是我自己的原因吧,正在排查,哪位大神指导还望课指导鄙人一下~先就此谢过~O(∩_∩)O~