PCA算法的步骤
① 样本矩阵X的构成
假设待观察变量有M个属性,相当于一个数据在M维各维度上的坐标,我们的目标是在保证比较数据之间相似性不失真的前提下,将描述数据的维度尽量减小至L维(L
样本矩阵X在这里用x 1 ,x 2 ,…,x N 共N个数据(这些数据都是以列向量的形式出现)来表示,那么X=[x 1 x 2 … x N ] MxN 。
② 计算样本X均值
计算第m维(m=1,2,…,M)的均值如下:
③ 计算观察值与均值的偏差
在每一维上,用当前值X[m,n]减去u[m],用矩阵运算表示如下:
明显,h是一行向量,u是一列向量。
④ 计算协方差矩阵
我们认为b i 代表B的第i行,那么由协方差矩阵
推知
<>表示向量的内积,也就是每一项的积之和。
⑤ 计算协方差矩阵C的特征值和特征向量
若XA=aA,其中A为一列向量,a为一实数。那么a就被称为矩阵X的特征值,而A则是特征值a对应的特征向量。
顺便扯一下,在matlab里面,求解上述A以及a,使用eig函数。如[D,V] = eig(C),那么D就是n个列特征向量,而V是对角矩阵,对角线上的元素就是特征值。
⑥ 排序
将特征值按 从大到小 的顺序排列,并根据特征值调整特征向量的排布。
D’=sort(D);V’=sort(V);
⑦ 计算总能量并选取其中的较大值
若V’为C的对角阵,那么总能量为对角线所有特征值之和S。
由于在步骤⑥里面已对V进行了重新排序,所以当v’前几个特征值之和大于等于S的90%时,可以认为这几个特征值可以用来"表征"当前矩阵。
假设这样的特征值有L个。
⑧ 计算基向量矩阵W
实际上,W是V矩阵的前L列,所以W的大小就是 MxL 。
⑨ 计算z-分数(这一步可选可不选)
Z[i,j]=B[i,j]/sqrt(D[i,i])
⑩ 计算降维后的新样本矩阵
W * 表示W的转置的共轭矩阵,大小为 LxM , 而Z的大小为 MxN , 所以Y的大小为 LxN , 即降维为 N 个 L 维向量。
总结一下:
去除平均值
计算协方差矩阵
计算协方差矩阵的特征值和特征向量
将特征值从大到小排序
保留最上面的N个特征值
Python实现PCA算法源代码如下:
def pca(dataMat, topNfeat=9999999):
meanVals = mean(data, axis=0) #求均值
meanRemoved = dataMat - meanVals #去除均值
covMat = cov(meanRemoved, rowvar=0) #计算协方差
eigVsls, eigVects = linalg.eig(mat(covMat)) #计算协方差矩阵的特征值和特征向量
eigValInd = argsort(eigVals) #特征值从大到小排序
eigValInd = eigValInd[:-(topNfeat+1):-1]
redEigVects = eigVects[:,eigValInd]
lowDDateMat = meanRemoved * redFigVects #将数据转换到新的空间
reconMat = (lowDDataMat * redEigVects.T) + meanVals
return lowDDataMat, reconMat