PCA
主成分分析,一种将一组可能相关的变量转变为一组线性不相关的新变量的降维手段。用于去除数据中的噪声,以利于其他机器学习算法。
PCA的原理:
- 降维是通过将矩阵映射到基所表示的空间中去,由于基的数量少于矩阵本身的维数,从而达到降维的效果。
- 为了最大程度保留源数据信息,确保源数据到基上投影值尽可能分散。而单一维度分散程度用方差进行度量,高维多个基上的分散程度用协(xiang)方(guan)差(xing)度量,为了尽可能分散,方差尽可能大,各字段两两间协方差为0.
降维问题的优化目标就是:将一组N维向量降为K维(0<K<N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)。降维问题的优化目标就是:将一组N维向量降为K维(0<K<N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)。 - 设我们有m个n维数据记录组成的源数据,将其按列排成n乘m的矩阵X,设
C
=
1
/
m
X
X
T
C = 1/m XX^{T}
C=1/mXXT,则C是一个对称矩阵,其对角线分别个各个字段的方差,而第i行j列和j行i列元素相同,表示i和j两个字段的协方差。
设原始数据矩阵X对应的协方差矩阵为C,而P是一组基按行组成的矩阵,设Y=PX,则Y为X对P做基变换后的数据。优化目标变成了寻找一个矩阵P,满足 P C P T PCP^T PCPT是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,Y就是X从N维降到了K维并满足上述优化条件。
算法优缺点
PCA算法的主要优点有:
- 各主成分之间正交,可消除原始数据成分间的相互影响的因素。
- 计算方法简单,主要运算是特征值分解,易于实现。
PCA算法的主要缺点有:
- 主成分各个特征维度的含义具有一定的模糊性。
- 方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。
- 对于第二最大方差不是与第一主成分正交方向的问题不适用。
实现:
设有m条n维数据。
-
将原始数据按列组成n行m列矩阵X
-
将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
-
求出协方差矩阵 C = 1 / m X X T C = 1/m XX^{T} C=1/mXXT
-
求出协方差矩阵的特征值及对应的特征向量
-
将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
-
Y=PX即为降维到k维后的数据
python代码
from numpy import *
def pca(dataMat, topNfeat=9999999):
'''
input:
dataMat:原始数据矩阵,shape:n,m
topNfeat:降维后的维数k
'''
meanVals = mean(dataMat, axis=1)
meanRemoved = dataMat - meanVals #remove mean
covMat = cov(meanRemoved, rowvar=True)
eigVals,eigVects = linalg.eig(mat(covMat))
eigValInd = argsort(eigVals) #sort, sort goes smallest to largest
eigValInd = eigValInd[:-(topNfeat+1):-1] #cut off unwanted dimensions
redEigVects = eigVects[eigValInd,:] #reorganize eig vects largest to smallest
lowDDataMat = redEigVects * meanRemoved #transform data into new dimensions
print(meanRemoved.shape, redEigVects.shape)
reconMat = (redEigVects.T * lowDDataMat) + meanVals
return lowDDataMat, reconMat