机器学习PCA学习(主成分分析)

前言

主成分分析(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

希望这篇文章对大家的学习有所帮助!

你可能感兴趣的:(机器学习,机器学习,python,算法)