pca的学习
1 pca的推导
pca用来对数据进行简化,它的思想是数据中能够提供较大信息量的特征才是需要注意的特征,而提供很少信息量的特征是各种波动的误差带来的,应该剔除
而在数据个方向上的信息量可以用方差量表示,方差越大证明数据在这个方向上差别越大,能够带来跟多的信息
原始数据 D ,单位方向向量 v
为了方便计算,对D进行去中心化:
方差计算公式为:
而协方差 :
因此 :
优化问题转化为:
利用拉格朗日方程求得v得最优解:
因为v时单位方向向量,因此λ可以看作是协方差矩阵v方向上的特征值
将等式带回目标函数
由此可知,数据某特征的信息量为该特征方向上特征值,特征值越大,信息量越大
2 代码
def pca(datamat,topN):
meandata=mean(datamat,axis=0) #求数据的均值
meanremove=datamat-meandata #数据去中心化
covmat=cov(meanremove,rowvar=False) #计算协方差
k,arr=linalg.eig(mat(covmat)) #计算特征值和特征向量
List=argsort(-k) #特征值从大到小排列,返回索引
k=k[List]
arr=arr[:,List] #特诊向量重排
k=k[:topN] #最大的topN个特征值
arr=arr[:,:topN] #最大的topN个特征值对应的特征向量
newdata=meanremove*arr #将数据转换到新空间
redata=newdata*arr.T+meandata #重构数据
return k,arr,redata,newdata