主成分分析(Principal Components Analysis, PCA)是一种常用的数据分析手段,是图像处理过程中常用到的降维方法。对于一组不同维度之间可能存在线性相关关系的数据,PCA能够把这组数据通过正交变换变成各个维度之间线性无关的数据,通过剔除方差小的那些维度上的数据,达到数据降维的目的。
PCA从原始变量出发,通过旋转变化(即原始变量的线性组合)构建出一组新的,互不相关的新变量,这些变量尽可能多的解释原始数据之间的差异性(即数据内在的结构),他们就成为原始数据的主成分。由于这些变量不相关,因此他们无重叠的各自解释一部分差异性。依照每个变量解释时差异性大小排序,他们成为第一主成分,第二主成分,以此类推。
PCA的思想是将n维特征映射到k维上(k<n),这k维特征称为主元(主成分),是旧特征的线性组合,这些线性组合最大化样本方差,尽量使用新的k个特征互不相关。这k维是全新的正交特征,是重新构造出来的k维特征,而不是简单地从n维特征中取出其余n-k维特征。
下面说一下PCA降维的算法步骤。
设有m条n维数据:
1) 将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化(去平均值),即减去这一行的均值
3)求出协方差矩阵
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P(保留最大的k各特征向量)
6)Y=PX 即为降维到K维后的数据
PCA算法的主要优点:
1)仅仅需要以方差衡量信息量,不受数据集以外的因素影响
2)各主成分之间正交,可消除原始数据成分间的互相影响的因素
3)计算方法简单,主要运算是特征值分解,易于实现
PCA算法的主要缺点:
1)主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强
2)方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响
利用Python实现主成分降维代码:
from numpy import *
def loadDataSet(fileName, delim='\t'):
fr = open(fileName)
stringArr = [line.strip().split(delim) for line in fr.readlines()]
datArr = [map(float,line) for line in stringArr]
return mat(datArr)
def pca(dataMat, topNfeat=999999):
meanVals = mean(dataMat, axis=0)
DataAdjust = dataMat - meanVals #减去平均值
covMat = cov(DataAdjust, rowvar=0)
eigVals,eigVects = linalg.eig(mat(covMat)) #计算特征值和特征向量
#print eigVals
eigValInd = argsort(eigVals)
eigValInd = eigValInd[:-(topNfeat+1):-1] #保留最大的前K个特征值
redEigVects = eigVects[:,eigValInd] #对应的特征向量
lowDDataMat = DataAdjust * redEigVects #将数据转换到低维新空间
reconMat = (lowDDataMat * redEigVects.T) + meanVals #重构数据,用于调试
return lowDDataMat, reconMat
import matplotlib
import matplotlib.pyplot as plt
dataMat = loadDataSet('testSet.txt')
lowDMat, reconMat = pca(dataMat,1)
print "shape(lowDMat): ",shape(lowDMat)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
plt.show()
详细完整代码及数据集下载:
点击我查看源码
参考:
https://www.cnblogs.com/wj-1314/p/8032780.html
相关文献:http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf