主成分分析(PCA)

xiaoxiao2021-02-28  474

昨天看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) #计算协方差矩阵,除数n-1是为了得到协方差的无偏估计, cov(X,0) = cov(X) 除数是n-1(n为样本个数),cov(X,1) 除数是n eigVals,eigVects = linalg.eig(mat(covMat)) #计算协方差矩阵的特征值和特征向量 eigValInd = argsort(eigVals) #对特征值矩阵进行由小到大排序,返回对应排序后的索引 eigValInd = eigValInd[:-(topNfeat+1):-1] #从排序后的矩阵最后一个开始自下而上选取最大的N个特征值,返回其对应的索引 redEigVects = eigVects[:,eigValInd] #将特征值最大的N个特征值对应索引的特征向量提取出来,组成降维矩阵 lowDDataMat = meanRemoved * redEigVects #将去除均值后的数据矩阵*压缩矩阵,转换到新的空间,使维度降低为N 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] #利用map()函数,将列表中每一行的数据值映射为float型 return mat(datArr) #将float型数据值的列表转化为矩阵 datMat = pca.loadDataSet('textSet.txt') lowDMat, reconMat = pca.pca(dataMat, 1) shape(lowDMat)m #(1000, 1)
转载请注明原文地址: https://www.6miu.com/read-22242.html

最新回复(0)