版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kabuto_hui/article/details/80616738
PCA(Principal Component Analysis, PCA)主成分分析法是一种应用比较广的降维技术,也是在模式识别领域中的一种行之有效的特征提取方法,是一种最优正交变换。
1.原理
降维的目的是减少预测变量的个数,并且这些预测变量都是相互独立的。
对于一个样本空间,我们寻求一个超平面来对我们的样本进行表达:
最近重构性:样本点到这个超平面的的距离都足够近(样本点到超平面的距离和最小)
最大可分性:样本点在这个超平面上的投影尽可能的分开
假设投影后的新坐标系为 ,其中 是标准正交基,即任意两个向量的数量积问为0,每个向量的内积为 1。若丢弃新坐标系中的部分坐标,就可以将维度降低到 ,样本点在低维坐标系中的投影为 。那么按照最近重构性,我们需要优化的就是:每个样本点到分离超平面之间的距离之和最小,用数学的方式表达为:
等价于:
使用拉格朗日乘子法可得:
于是,只需要对协方差矩阵 进行特征值分解,将求得的特征值进行排序,并提取前 个特征值对应的特征向量构成坐标变换空间 。于是PCA算法可以描述为:
1.对所有样本进行中心化(每个样本减去均值):
2.计算样本的协方差矩阵
3.对协方差矩阵 做特征值分解
4.取最大的前 的特征值对应的特征向量构成投影矩阵
2.算法实现
#pca特征维度压缩函数
#@dataMat 数据集矩阵
#@topNfeat 需要保留的特征维度,即要压缩成的维度数,默认4096
def pca(dataMat,topNfeat=4096):
#求数据矩阵每一列的均值
meanVals=mean(dataMat,axis=0)
#数据矩阵每一列特征减去该列的特征均值
meanRemoved=dataMat-meanVals
#计算协方差矩阵,除数n-1是为了得到协方差的无偏估计
#cov(X,0) = cov(X) 除数是n-1(n为样本个数)
#cov(X,1) 除数是n
covMat=cov(meanRemoved,rowvar=0)
#计算协方差矩阵的特征值及对应的特征向量
#均保存在相应的矩阵中
eigVals,eigVects=linalg.eig(mat(conMat))
#sort():对特征值矩阵排序(由小到大)
#argsort():对特征值矩阵进行由小到大排序,返回对应排序后的索引
eigValInd=argsort(eigVals)
#从排序后的矩阵最后一个开始自下而上选取最大的N个特征值,返回其对应的索引
eigValInd=eigValInd[:-(topNfeat+1):-1]
#将特征值最大的N个特征值对应索引的特征向量提取出来,组成压缩矩阵
redEigVects=eigVects[:,eigValInd]
#将去除均值后的数据矩阵*压缩矩阵,转换到新的空间,使维度降低为N
lowDDataMat=meanRemoved*redEigVects
#利用降维后的矩阵反构出原数据矩阵(用作测试,可跟未压缩的原矩阵比对)
reconMat=(lowDDataMat*redEigVects.T)+meanVals
#返回压缩后的数据矩阵及该矩阵反构出原始数据矩阵
return lowDDataMat,reconMat