PCA降维 学习日志

1 篇文章 0 订阅
1 篇文章 0 订阅

10.10  上午上完数据分析,只学到了PCA

在学习PCA算法之前需要知道奇异值分解(SVD)

SVD就是用来寻找到一个标准化正交基(orthonormal matrix)P

我们最终的目标是是Cy=1/n(YY转置)是一个对角阵(diag),达到冗余最小,方差最大目的

example

 总结一下,PCA算法的基本思路是:
 

PCA算法

总结一下PCA的算法步骤:

设有m条n维数据。

1)将原始数据按列组成n行m列矩阵X

2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值

 

 

3)求出协方差矩阵

12014082-339c08d487bf7e9d

4)求出协方差矩阵的特征值及对应的特征向量

5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P

6)Y=PX即为降维到k维后的数据

PCA算法

总结一下PCA的算法步骤:

设有m条n维数据。

1)将原始数据按列组成n行m列矩阵X

2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值

3)求出协方差矩阵

12014082-339c08d487bf7e9d

4)求出协方差矩阵的特征值及对应的特征向量

5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P

6)Y=PX即为降维到k维后的数据

伪代码实现

去除平均值
计算协方差矩阵
计算协方差矩阵的特征值和特征向量
将特征值排序
保留前N个最大的特征值对应的特征向量
将数据转换到上面得到的N个特征向量构建的新空间中(实现了特征压缩)

 具体代码实现

#导入numpy库
from numpy import *

#解析文本数据函数
#@filename 文件名txt
#@delim 每一行不同特征数据之间的分隔方式,默认是tab键'\t'
def loadDataSet(filename,delim='\t')
    #打开文本文件
    fr=open(filename)
   
#对文本中每一行的特征分隔开来,存入列表中,作为列表的某一行
    #行中的每一列对应各个分隔开的特征
    stringArr=[line.strip().split(delim) for line in fr.readlines()]
 
  #利用map()函数,将列表中每一行的数据值映射为float型
    datArr=[map(float.line)for line in stringArr]
 
  #将float型数据值的列表转化为矩阵返回
    return mat(datArr)

#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))   #在这个mat函数具体是干什么的?
    #sort():对特征值矩阵排序(由小到大)
    #argsort():对特征值矩阵进行由小到大排序,返回对应排序后的索引
    eigValInd=argsort(eigVals)  
 
  #从排序后的矩阵最后一个开始自下而上选取最大的N个特征值,返回其对应的索引
    eigValInd=eigValInd[:-(topNfeat+1):-1]
    #将特征值最大的N个特征值对应索引的特征向量提取出来,组成压缩矩阵
    redEigVects=eigVects[:,eigValInd]  #返回排序后特征值对应的特征向量redEigVects(主成分)
    #将去除均值后的数据矩阵*压缩矩阵,转换到新的空间,使维度降低为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、付费专栏及课程。

余额充值