昨天看Robust Principal Component Analysis时,想起了上学习学习的PCA,在这里参考Peter Harrington的《机器学习实战》整理了上学期学习的PCA算法法(原理+Python实现),欢迎小伙伴们交流。
1.PCA原理
PCA是线性代数里面的K-L变换,是一种在均方误差准则下失真最小的变换,即将原空间变换到特征向量空间内,数学可表示:
Ax=
λx
特征向量表示不同频率和特征值表示其幅度。 具体操作:在PCA中,也就是将数据从原来的坐标系转换到到新的坐标系,新坐标系的选择由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴选择的和第一个新坐标轴正交且具有最大方差的方向,一次重复该过程,重复次数为原始数据特征的数目,事实发现大部分方差都包含在最前面的几个新坐标轴中,因此,可以忽略余下的坐标轴,即实现了对数据的降维。
2.PCA特点
优点:降低数据的复杂性、识别重要的多个特征 缺点:可能损失有用信息 适用数据类型:数值型数据、
3.PCA实现
'''
PCA将数据转换成前N个主成分大致流程:
1.去除平均值;
2.计算协方差矩阵;
3.计算协方差矩阵的特征值和特征向量;
4.将特征值从大到小排序;
5.保留最上面的N个特征向量;
6.将数据转换到上述N个特征向量构建的新空间中.(实现数据降维)
函数:实现数据降维
输入:datMat进行降维的数据,topNfeat选取的特征数目
输出:返回降维后的数据矩阵及该矩阵重构出原始数据矩阵
'''
def pca(dataMat, topNfeat=9999999):
meanVals = mean(dataMat, axis=
0)
meanRemoved = dataMat - meanVals
covMat = cov(meanRemoved, rowvar=
0)
eigVals,eigVects = linalg.eig(mat(covMat))
eigValInd = argsort(eigVals)
eigValInd = eigValInd[:-(topNfeat+
1):-
1]
redEigVects = eigVects[:,eigValInd]
lowDDataMat = meanRemoved * redEigVects
reconMat = (lowDDataMat * redEigVects.T) + meanVals
return lowDDataMat, reconMat
4.PCA测试
'''
函数:解析文本数据
输入: fileName文件名, delim每一行不同特征数据之间的分隔方式,默认是tab键'\t'
输出:将文件中float型数据值的列表转化为矩阵
'''
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)
datMat = pca.loadDataSet(
'textSet.txt')
lowDMat, reconMat = pca.pca(dataMat,
1)
shape(lowDMat)m