前言
主成分分析(Principal Components Analysis),简称PCA,一种数据降维技术,常用于数据处理这一方面,好比说我们的数据集中有100个特征,这些特征可能有共性、无用的信息,或者我们想要将多特征融合,此时我们就需要用到PCA降维技术。
PCA实现原理
通俗来说,就是将数据从原始的向量空间转换到新的特征空间中去。比如:我们有在原始向量空间中的四维数据(a,b,c,d),需要将其降到三维,那么原理是通过某种方法,用新的坐标(a0,b0,c0,d0)来表示原始坐标。(在新的特征空间中,可能所有数据在d坐标轴上的投影接近于0,那么我们就可以将其忽略,此时四维数据将为三维)
PCA降维的求解过程
一般的步骤为先对原始数据进行零均值化,然后求协方差矩阵,接着对协方差矩阵求特征向量和特征值。
过程讲解
零均值化
(注意:矩阵中每一行代表一个样本,每一列代表同一个特征)零均值化就是求每一列的平均值然后该列上的所有数减去这个均值。
求协方差矩阵
np.cov(dataMat, rowvar=0)
我们通过numpy中的cov函数求解协方差矩阵,其中参数rowvar很重要,如果rowvar=0,则传入的数据一行代表一个样本;否则传入的数据一列代表一个样本。
求特征值、特征矩阵
eigVals, eigVects = np.linalg.eig(np.mat(covMat)) # eigVals代表特征值(行向量),eigVects代表特征向量,每一列代表一个特征向量
我们通过numpy中的linalg的eig函数来实现这一过程。
代码实现
def zeroMean(dataMat):
meanVal = np.mean(dataMat, axis=0)
newData = dataMat - meanVal
return newData, meanVal
def pca(dataMat, n):
newData, meanVal = zeroMean(dataMat)
covMat = np.cov(newData, rowvar=0) # 求协方差矩阵
eigVals, eigVects = np.linalg.eig(np.mat(covMat)) # 求特征值和特征向量,特征向量是按列排列的,每一列代表一个特征向量
eigValIndice = np.argsort(eigVals) # 对特征值从小到大排序
n_eigValIndice = eigValIndice[-1:-(n+1):-1] # 最大的n个特征值的下标
n_eigVect = eigVects[:, n_eigValIndice] # 最大的n个特征值对应的特征向量
lowDataMat = newData * n_eigVect # 低维特征空间的数据
reconMat = (lowDataMat*n_eigVect.T) + meanVal # 重构数据
return lowDataMat, reconMat
希望这篇文章对大家的学习有所帮助!