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

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

1.原理

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

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

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

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

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

    min i=1m||j=1dzijwjxi||2=i=1mzTizi2i=1mzTiWTxi+const 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

    等价于:
    min tr(WTXXTW)s.t. WTW=1 m i n   − t r ( W T X X T W ) s . t .   W T W = 1

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

XXTwi=λiwi X X T w i = λ i w i

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

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

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

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

4.取最大的前 d d ∗ 的特征值对应的特征向量构成投影矩阵 W={w1,w2,...,wd} 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值