首页 技术 正文
技术 2022年11月18日
0 收藏 578 点赞 2,317 浏览 3686 个字

【引言】–PCA降维的作用  面对海量的、多维(可能有成百上千维)的数据,我们应该如何高效去除某些维度间相关的信息,保留对我们“有用”的信息,这是个问题。  PCA给出了我们一种解决方案和思路。  PCA给我的第一印象就是去相关,这和数据(图像、语音)压缩的想法是一致的。当然,PCA像是一种有损的压缩算法。但是不要紧,去除掉的信息也许是噪声呢,而且损失的信息不是“主要成分”。  PCA 降维的概念不是简单的去除原特征空间的某些维度,而是找出原特征空间的新的正交基,并且这个新的特征空间在某些唯度上信息量很少,可以忽略。使用这些新的正交基,我们可以表示出新的特征空间,。【实例】–从二维的降维解释(高维空间的降维问题也是一样的思路,这里注意样本的上下标表示:上标表示第几个样本,下标表示第几维的特征;所有向量都是列向量表示)问题描述:现在有数据集m个样本

每个样本是一个二维特征空间的点(维度n=2)

现在我们希望,找出新的正交基u1和u2(n维空间使用n个正交基就可以),重新表示这个空间(这个十分有趣,类似于矩阵乘法的物理意义:对向量做了线性变换),并且使得所有特征点在某些正交基(某些维度)上分量(类似于所有特征点对应的特征向量在该正交基上的投影之和)比较多(主成分由此而来),这样我们可以认为在该维度上

解决方案:(1)假设数据已经零均值化(这个只是为了方便运算,提前零均值化)如果这二维的可视图来看,我们人类很容易就知道了下图的u1信息较多。为何我们这么认为呢?怎么数字化的表示这个求U的过程。我们可以认为所有特征点在u1方向上的投影之和比较大,u1可以作为正交基。这样u2方向上的投影之和比较小,说明在u2方向上数据的不确定性比较小,基本在很小的范围内波动,甚至可以把这种波动当作噪声,可以认为在该方向上分量为0。这里用了数据的不确定性和波动,感觉还是比较形象的。由波动,引申出统计学的方差(方差刚好就是衡量数据相对于均值波动的),实际上我们就是在找波动最大,不确定最大的方向作为新的正交基。这就时最大方差理论的由来,不够在证明上,尽量使用“投影之和的概念”。求U的过程这类似一个求极值的过程,找到u1使得所有特征点在u1上投影之和最大,依次找出u2…最终得到U 

(2)投影之和 

这里使用了向量的点乘的物理意义:投影,刚好u1是单位向量。xi是原特征空间某一维度的所有取值,即xi是一个m维的向量,每个分量都是一个样本在唯度i上的样本值。我们稍微修改下d,更方便计算。 

a.对该公式做下变化: 

note1:一点都不显然,其实b.原始问题数学化 

note3: 单位正交基的性质c.使用拉格朗日求解约束问题

note4:对向量求导比较难以理解。(3)最后问题归结为:求协方差矩阵的最大特征值及对应特征向量(刚好就是新的正交基),此时该正交基上的信息量(不确定性)最大。–note5所以主成分可以通过求特征值及求特征向量来分析。特征值大,在对应特征向量的投影之和或者波动大。我们只需保留特征值较大的特征向量即可(4)得到低维的数据a.如何实现正交基的变换(联系矩阵乘法) 

b.对上式做转置 

于是A*U就是低维空间的数据,维度为k.【实现】实现比较简单,基本是证明的思路一步步求解即可

 #encoding: UTF-8 ''' Created on 2016��12��14�� @author: YYH ''' import numpy as np from array import array # 自己实现参考 # http://blog.csdn.net/u012162613/article/details/42177327 # 传入的数据格式:     array #                     每一行代表一个样本 #                     每一列代表一个唯度的信息 #数据中心化,使得各个维度的信息均为0 def meanshift(dataArr):     mean = np.mean(dataArr,axis=0)#对每一列求均值     newData = dataArr-mean     return newData,mean def zeroData(dataArr,mean):     newData = dataArr-mean     return newData class PCA:     def __init__(self, n_components=1,percentage=0.99):         self.dstDim = n_components         self.reservePercentage = percentage     def __del__(self):         pass     def fit(self,dataArr):         zeroMeanData,meanVal = meanshift(dataArr)         self.meanVal = meanVal#保存数据中心 #         求协方差矩阵,rowvar = 0:一行代表一个样本         cov = np.cov(zeroMeanData,rowvar=0)         #求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量         eigVals,eigVector =np.linalg.eig(cov)         eigValsIndice = np.argsort(eigVals)#从小到大排列         n_eigValsIndice = eigValsIndice[-1:-(self.dstDim+1):-1] #最大的n个特征的下标         n_eigVect = eigVector[:,n_eigValsIndice]#最大的n个特征值对应的特征向量         n_eigVect = np.matrix(n_eigVect)         self.n_eigVect = n_eigVect #保存特征向量     def fit_transform(self,dataArr):         zeroMeanData,meanVal = meanshift(dataArr)         self.meanVal = meanVal#保存数据中心 #         求协方差矩阵,rowvar = 0:一行代表一个样本         cov = np.cov(zeroMeanData,rowvar=0)         #求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量         eigVals,eigVector =np.linalg.eig(cov)         eigValsIndice = np.argsort(eigVals)#从小到大排列         n_eigValsIndice = eigValsIndice[-1:-(self.dstDim+1):-1] #最大的n个特征的下标         n_eigVect = eigVector[:,n_eigValsIndice]#最大的n个特征值对应的特征向量         zeroMeanData = np.matrix(zeroMeanData)         n_eigVect = np.matrix(n_eigVect)         self.n_eigVect = n_eigVect #保存特征向量         lowDData = zeroMeanData*n_eigVect #低维特征空间的数据 #         reConData = (lowDData*n_eigVect.T)+meanVal #重构数据         return lowDData     def transform(self,dataArr):         zeroMeanData = zeroData(dataArr,self.meanVal)         zeroMeanData = np.matrix(zeroMeanData)         lowDData = zeroMeanData*self.n_eigVect #低维特征空间的数据 #         reConData = (lowDData*n_eigVect.T)+meanVal #重构数据         return lowDData         

【代码验证】

  在做手写数字识别时,我分别使用了sklearn的PCA,和自己整理的PCA,达到的准确度都到了96%左右。

  在PCA降维后的数据来看,可能在特征向量上方向不同,导致部分列跟sklearn的符号相反

  时间上,可能自己整理实现的PC A现在耗时短点,毕竟目前是比较简单的PC A

【参考链接】1.PCA 的最大方差理论和最小二乘法证明(PCA的概念讲得很清楚 但证明比较晦涩,不知道在作甚)http://blog.csdn.net/zhongkelee/article/details/440644012.手把手交你实现PCAhttp://blog.csdn.net/u012162613/article/details/421773273.Andrew Ng(通常不方差归一化)http://deeplearning.stanford.edu/wiki/index.php/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%904.PCA 证明(协方差的主特征向量就是数据变化最大的主方向)http://blog.csdn.net/jwh_bupt/article/details/8935219 5.LDA和PC A的证明http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html

上一篇: jq 剪切板
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,564
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,413
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,186
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905