【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现

时间:2022-12-30 13:08:02
【引言】--PCA降维的作用
  面对海量的、多维(可能有成百上千维)的数据,我们应该如何高效去除某些维度间相关的信息,保留对我们“有用”的信息,这是个问题。
  PCA给出了我们一种解决方案和思路。
  PCA给我的第一印象就是去相关,这和数据(图像、语音)压缩的想法是一致的。当然,PCA像是一种有损的压缩算法。但是不要紧,去除掉的信息也许是噪声呢,而且损失的信息不是“主要成分”。
  PCA 降维的概念不是简单的去除原特征空间的某些维度,而是找出原特征空间的新的正交基,并且这个新的特征空间在某些唯度上信息量很少,可以忽略。使用这些新的正交基,我们可以表示出新的特征空间,。
【实例】--从二维的降维解释(高维空间的降维问题也是一样的思路,这里注意样本的上下标表示:上标表示第几个样本,下标表示第几维的特征;所有向量都是列向量表示)
问题描述:
现在有数据集m个样本
【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现
每个样本是一个二维特征空间的点(维度n=2)
【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现
现在我们希望,找出新的正交基u1和u2(n维空间使用n个正交基就可以),重新表示这个空间(这个十分有趣,类似于矩阵乘法的物理意义:对向量做了线性变换),并且使得所有特征点在某些正交基(某些维度)上分量(类似于所有特征点对应的特征向量在该正交基上的投影之和)比较多(主成分由此而来),这样我们可以认为在该维度上
【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现
解决方案:
(1)假设数据已经零均值化(这个只是为了方便运算,提前零均值化)
如果这二维的可视图来看,我们人类很容易就知道了下图的u1信息较多。为何我们这么认为呢?怎么数字化的表示这个求U的过程。
我们可以认为所有特征点在u1方向上的投影之和比较大,u1可以作为正交基。这样u2方向上的投影之和比较小,说明在u2方向上数据的不确定性比较小,基本在很小的范围内波动,甚至可以把这种波动当作噪声,可以认为在该方向上分量为0。
这里用了数据的不确定性和波动,感觉还是比较形象的。由波动,引申出统计学的方差(方差刚好就是衡量数据相对于均值波动的),实际上我们就是在找波动最大,不确定最大的方向作为新的正交基。这就时最大方差理论的由来,不够在证明上,尽量使用“投影之和的概念”。
求U的过程这类似一个求极值的过程,找到u1使得所有特征点在u1上投影之和最大,依次找出u2...最终得到U
 【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现
(2)投影之和
 【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现
这里使用了向量的点乘的物理意义:投影,刚好u1是单位向量。xi是原特征空间某一维度的所有取值,即xi是一个m维的向量,每个分量都是一个样本在唯度i上的样本值。
我们稍微修改下d,更方便计算。
 【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现
a.对该公式做下变化:
 【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现
note1:一点都不显然,其实
b.原始问题数学化
 【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现
note3: 单位正交基的性质
c.使用拉格朗日求解约束问题

【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现

【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现

note4:对向量求导比较难以理解。
(3)最后问题归结为:求协方差矩阵的最大特征值及对应特征向量(刚好就是新的正交基),此时该正交基上的信息量(不确定性)最大。--note5
所以主成分可以通过求特征值及求特征向量来分析。特征值大,在对应特征向量的投影之和或者波动大。我们只需保留特征值较大的特征向量即可
(4)得到低维的数据
a.如何实现正交基的变换(联系矩阵乘法)
 【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现
b.对上式做转置
 【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现
于是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

【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现

【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现

【参考链接】
1.PCA 的最大方差理论和最小二乘法证明(PCA的概念讲得很清楚 但证明比较晦涩,不知道在作甚)
2.手把手交你实现PCA
3.Andrew Ng(通常不方差归一化)
4.PCA 证明(协方差的主特征向量就是数据变化最大的主方向)
 
5.LDA和PC A的证明

【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现的更多相关文章

  1. R: 主成分分析 ~ PCA(Principal Component Analysis)

    本文摘自:http://www.cnblogs.com/longzhongren/p/4300593.html 以表感谢. 综述: 主成分分析 因子分析 典型相关分析,三种方法的共同点主要是用来对数据 ...

  2. 用scikit-learn学习主成分分析(PCA)

    在主成分分析(PCA)原理总结中,我们对主成分分析(以下简称PCA)的原理做了总结,下面我们就总结下如何使用scikit-learn工具来进行PCA降维. 1. scikit-learn PCA类介绍 ...

  3. 解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程(转载)

    KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实 ...

  4. 核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程

    KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实 ...

  5. PCA(Principal Component Analysis)笔记

    PCA是机器学习中recognition中的传统方法,今天下午遇到了,梳理记一下 提出背景: 二维空间里,2个相近的样本,有更大概率具有相同的属性,但是在高维空间里,由于样本在高维空间里,呈现越来越稀 ...

  6. 主成分分析(principal components analysis, PCA)——无监督学习

    降维的两种方式: (1)特征选择(feature selection),通过变量选择来缩减维数. (2)特征提取(feature extraction),通过线性或非线性变换(投影)来生成缩减集(复合 ...

  7. 《principal component analysis based cataract grading and classification》学习笔记

    Abstract A cataract is lens opacification caused by protein denaturation which leads to a decrease i ...

  8. 机器学习 —— 基础整理(四)特征提取之线性方法:主成分分析PCA、独立成分分析ICA、线性判别分析LDA

    本文简单整理了以下内容: (一)维数灾难 (二)特征提取--线性方法 1. 主成分分析PCA 2. 独立成分分析ICA 3. 线性判别分析LDA (一)维数灾难(Curse of dimensiona ...

  9. 【机器学习】--主成分分析PCA降维从初识到应用

    一.前述 主成分分析(Principal Component Analysis,PCA), 是一种统计方法.通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分. ...

随机推荐

  1. PARENT VIEW INVALIDATE

    如果启动display list,parentview 调用invalidate,子view是不会是去调用onDraw的,因为直接调用displaylist了,如果parentview认为子view应 ...

  2. SAP/SD - 做SD你要知道的透明表

    一.客户主数据基本数据放在KNA1里:公司代码放在KNB1里:销售视图放在KNVV里:合作伙伴放在KNVP里:二.信用主数据KNKK里有信贷限额.应收总额.特别往来:S066里是未清订单值:S067里 ...

  3. win10下安装Ubuntu + 修复Ubuntu引导

    如何在已安装 Windows 10 的情况下安装 Linux(Ubuntu 15.04)双系统? - Microsoft Windows - 知乎http://www.zhihu.com/questi ...

  4. 为什么使用 Bootstrap?

    为什么使用 Bootstrap? 移动设备优先:自 Bootstrap 3 起,框架包含了贯穿于整个库的移动设备优先的样式. 浏览器支持:所有的主流浏览器都支持 Bootstrap.      容易上 ...

  5. 51nod 博弈论水题

    51nod1069 Nim游戏 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误 ...

  6. DEV SIT UAT

    DEV环境:DEV顾名思义就是develop,即代码开发的环境.SIT环境:System Integration Test系统集成测试,开发人员自己测试流程是否走通.UAT环境:User Accept ...

  7. Objective-C Runtime 运行时之四:Method Swizzling(转载)

    理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Me ...

  8. 用PLSQL Developer 查看Oracle的存储过程

    1 2.输入 3.具体存储过程

  9. tmux安装与使用

    安装 用法 重点 一prefix前缀键 二window和pane的区分 tmux 按照官方给出的介绍是:终端复用工具.说白了就是可以仅仅在开启一个终端的情况下同时处理多个任务. 比如下面我设置的这样一 ...

  10. 7.20 文本框内容 超出 显示 。。 和 split

    word-wrap:break-word; word-break:break-all; overflow:auto; split  去 :等 ,只要有: 就会在:两边 各生产一个值 ,所有 应习惯把最 ...