从零开始-Machine Learning学习笔记(14)-PCA主成分分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kabuto_hui/article/details/80616738

​ PCA(Principal Component Analysis, PCA)主成分分析法是一种应用比较广的降维技术,也是在模式识别领域中的一种行之有效的特征提取方法,是一种最优正交变换

1.原理

​ 降维的目的是减少预测变量的个数,并且这些预测变量都是相互独立的。

​ 对于一个样本空间,我们寻求一个超平面来对我们的样本进行表达:

  • 最近重构性:样本点到这个超平面的的距离都足够近(样本点到超平面的距离和最小)

  • 最大可分性:样本点在这个超平面上的投影尽可能的分开

    假设投影后的新坐标系为 W = { w 1 . w 2 , . . . , w d } ,其中 w i 是标准正交基,即任意两个向量的数量积问为0,每个向量的内积为 1。若丢弃新坐标系中的部分坐标,就可以将维度降低到 d < d ,样本点在低维坐标系中的投影为 Z i j = ( W j ) T x i 。那么按照最近重构性,我们需要优化的就是:每个样本点到分离超平面之间的距离之和最小,用数学的方式表达为:

    m i n   i = 1 m | | j = 1 d z i j w j x i | | 2 = i = 1 m z i T z i 2 i = 1 m z i T W T x i + c o n s t

    等价于:
    m i n   t r ( W T X X T W ) s . t .   W T W = 1

使用拉格朗日乘子法可得:

X X T w i = λ i w i

于是,只需要对协方差矩阵 X X T 进行特征值分解,将求得的特征值进行排序,并提取前 d 个特征值对应的特征向量构成坐标变换空间 W = { w 1 , w 2 , . . . , w d } 。于是PCA算法可以描述为:

1.对所有样本进行中心化(每个样本减去均值): X = X m e a n s ( X )

2.计算样本的协方差矩阵 X X T

3.对协方差矩阵 X X T 做特征值分解

4.取最大的前 d 的特征值对应的特征向量构成投影矩阵 W = { w 1 , w 2 , . . . , w d }

2.算法实现

#pca特征维度压缩函数
#@dataMat 数据集矩阵
#@topNfeat 需要保留的特征维度,即要压缩成的维度数,默认4096    
def pca(dataMat,topNfeat=4096):
    #求数据矩阵每一列的均值
    meanVals=mean(dataMat,axis=0)
    #数据矩阵每一列特征减去该列的特征均值
    meanRemoved=dataMat-meanVals
    #计算协方差矩阵,除数n-1是为了得到协方差的无偏估计
    #cov(X,0) = cov(X) 除数是n-1(n为样本个数)
    #cov(X,1) 除数是n
    covMat=cov(meanRemoved,rowvar=0)
    #计算协方差矩阵的特征值及对应的特征向量
    #均保存在相应的矩阵中
    eigVals,eigVects=linalg.eig(mat(conMat))
    #sort():对特征值矩阵排序(由小到大)
    #argsort():对特征值矩阵进行由小到大排序,返回对应排序后的索引
    eigValInd=argsort(eigVals)
    #从排序后的矩阵最后一个开始自下而上选取最大的N个特征值,返回其对应的索引
    eigValInd=eigValInd[:-(topNfeat+1):-1]
    #将特征值最大的N个特征值对应索引的特征向量提取出来,组成压缩矩阵
    redEigVects=eigVects[:,eigValInd]
    #将去除均值后的数据矩阵*压缩矩阵,转换到新的空间,使维度降低为N
    lowDDataMat=meanRemoved*redEigVects
    #利用降维后的矩阵反构出原数据矩阵(用作测试,可跟未压缩的原矩阵比对)
    reconMat=(lowDDataMat*redEigVects.T)+meanVals
    #返回压缩后的数据矩阵及该矩阵反构出原始数据矩阵
    return lowDDataMat,reconMat

猜你喜欢

转载自blog.csdn.net/kabuto_hui/article/details/80616738
今日推荐