简介

UFLDL中介绍了主成分分析这一块的知识,而且当时学机器学习的时候,老师是将PCASVD联系起来将的,同时UFLDL也讲到了使用PCA做数据白化whitening处理,这个词经常在论文里面看到。

国际惯例,参考博客:

UFLDLPCA章节

PRML的第12.1 PCA章节

知乎深入理解PCA与SVD的关系

PCA and SVD explained with numpy

Relationship between SVD and PCA. How to use SVD to perform PCA?

百度百科正交投影

知乎正交投影

SVD(奇异值分解)小结

特征分解

协方差矩阵一定是满秩的吗?

PCA、ZCA白化

PCA理论

PRML中给出了PCA的两种定义:

  • 数据在低维线性空间上的正交投影,这个线性空间被称为主子空间,使得投影数据的方差被最大化
  • 平均投影代价最小的线性投影。其中平均投影代价是数据点与投影点之间的平均平方距离。

如下图就是将二维数据投影一维空间u1u_1u1​中

上图中红色的二维数据点被正交投影到主子空间(紫色的线),PCA的目的就是想让投影后的数据(绿色点)具有最大的方差。 其中正交投影被神乎其神的说了一大堆理论,其实就是投影线垂直于投影面。

通常情况下,我们都是用第一个定义去理解PCA的,设每个样本都有D个属性,即D维向量,总共有N个样本。

第一步将数据投影到D维向量u1u_1u1​上,一般来说我们设这个u1u_1u1​是D维空间中的方向向量:
x^=u1Tx\hat{x}=u_1^Tx x^=u1T​x
第二步求投影方差
1N{u1Txn−u1Txˉ}2=u1TSu1\frac{1}{N}\{u_1^Tx_n-u_1^T\bar{x}\}^2=u_1^TSu_1 N1​{u1T​xn​−u1T​xˉ}2=u1T​Su1​
其中xˉ\bar{x}xˉ所有样本均值xˉ=1N∑n=1Nxn\bar{x}=\frac{1}{N}\sum_{n=1}^Nx_nxˉ=N1​∑n=1N​xn​,注意不是每个样本所有属性求均值。

其中SSS是原数据集的协方差矩阵:
S=1N∑n=1N(xn−xˉ)(xn−xˉ)TS=\frac{1}{N}\sum_{n=1}^N(x_n-\bar{x})(x_n-\bar{x})^T S=N1​n=1∑N​(xn​−xˉ)(xn​−xˉ)T
【注】协方差反映的是属性与属性之间的关系,而非样本与样本之间的关系。

第三步约束

上面我们经常约束u1u_1u1​是方向向量,那么
u1Tu1=1u_1^Tu_1=1 u1T​u1​=1
结合这个约束以及为了让方差最大化的目标,可以利用拉格朗日乘数法建立下式:
u1TSu1+λ1(1−u1Tu1)u_1^TSu_1+\lambda_1(1-u_1^Tu_1) u1T​Su1​+λ1​(1−u1T​u1​)
当上式导数为零时,驻点满足
Su1=λ1u1Su_1=\lambda_1u_1 Su1​=λ1​u1​
很容易发现u1u_1u1​一定是SSS的特征向量,同时也能发现当λ1\lambda_1λ1​越大,方差越大。所以最大特征值对应的特征向量为第一主成分。同理就能利用特征分解的方法求解到第二、三、…主分量。

综上,可以得到PCA的一般步骤为:

  • 整理原始矩阵Xn×mX_{n \times m}Xn×m​ ,代表n个样本,每个样本维度为m

  • 求原始矩阵Xn×mX_{n \times m}Xn×m​的协防差阵Sm×m=Cov(X)S_{m\times m}=Cov(X)Sm×m​=Cov(X)

  • 求解协防差阵的特征值和特征向量。

  • 选取最大的K(人为给定)个特征值所对应的特征向量组成构成矩阵Wm×kW_{m\times k}Wm×k​

  • 直接进行矩阵计算,就得到了降维后的数据

Zn×k=Xn×mWm×kZ_{n\times k} = X_{n\times m }W_{m\times k } Zn×k​=Xn×m​Wm×k​

SVD 理论

一般来说实对称矩阵可以被分解为A=Q∑QTA=Q\sum Q^TA=Q∑QT的形式,其中QQQ为标准正交矩阵,∑\sum∑对角阵,对角阵上的元素λi\lambda_iλi​是矩阵A的特征值,对应的特征向量是QiQ_iQi​

那么如果矩阵AAA为非实对称矩阵的时候,有没有类似的
A=UΣVTA=U\Sigma V^T A=UΣVT
奇异值分解(singular value decompositionSVD)做的就是这件事。在SVD的官方术语中,U是(n,n)(n,n)(n,n)维的方阵称为左奇异向量;Σ\SigmaΣ是(n,m)(n,m)(n,m)的对角阵,对角线上的元素称为奇异值;V 是(m,m)(m,m)(m,m)维度的方阵称为右奇异向量,并且UV均为单位正交矩阵,UUT=1UU^T=1UUT=1且VVT=1VV^T=1VVT=1

求解方法就是利用AATAA^TAAT与ATAA^TAATA都是对称阵的特性,得到:
AAT=UΣΣTUTATA=VΣTΣVTAA^T=U\Sigma \Sigma ^T U^T \\ A^TA=V\Sigma^T\Sigma V^T AAT=UΣΣTUTATA=VΣTΣVT
这样就能求解出U、Σ\SigmaΣ、V。

这篇文章里面有例子。

PCA和SVD的关系

摘自此处,通过协方差矩阵的求解方法建立联系:

SVD中:
S=ATX=VΣUTUΣVT=VΣ2VT=VΣ2V−1S=A^TX =V\Sigma U^T U\Sigma V^T =V\Sigma ^2V^T =V\Sigma^2V^{-1} S=ATX=VΣUTUΣVT=VΣ2VT=VΣ2V−1
而在PCA中:
S=u1λ1u1−1S=u_1\lambda_1u_1^{-1} S=u1​λ1​u1−1​
所以:
λ=Σ2u=V\lambda=\Sigma^2\\ u=V λ=Σ2u=V
这一点可以通过代码验证:

a=np.array([[1,5,7],[2,3,6],[5,9,3]])
C = np.dot(a.T, a)eigen_vals,eigen_vecs = np.linalg.eig(C)
u,sigma,v=np.linalg.svd(a,full_matrices=False,compute_uv=True)print(eigen_vals,sigma**2)
'''
[208.58666048   1.52969164  28.88364788] [208.58666048  28.88364788   1.52969164]
'''eigen_vecs
'''
array([[-0.34088613, -0.85005392, -0.40150339],[-0.72034757,  0.51060491, -0.46944862],[-0.60406625, -0.12919347,  0.78639241]])
'''v.T
'''
array([[-0.34088613, -0.40150339, -0.85005392],[-0.72034757, -0.46944862,  0.51060491],[-0.60406625,  0.78639241, -0.12919347]])
'''

使用PCA对mnist数据集降维

其实在这里遇到一个问题:使用eig对手写数字数据集的协方差矩阵求解特征值时得到了复数特征值和特征向量,这一点暂时没弄明白,但是使用svd可以得到正常的特征值和特征向量。

sklearn中的pca

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
result = pca.fit_transform(data)

得到结果图

numpy手撕PCA

def PCA_numpy(X):#零均值化print(X.shape)X=X-X.mean(axis=0)## 使用特征值和特征向量#协方差矩阵#cov_X = np.cov(X,rowvar=0)#每一列一个特征#eig_val,eig_vec = np.linalg.eig(cov_X)   #出现复数了##使用svdU,eig_val,eig_vec = np.linalg.svd(X)#选两个最大的idx = np.argsort(-eig_val)temp_M=[]for i in range(2):temp_M.append(eig_vec[idx[i]])temp_M = np.array(temp_M).Tresult = np.dot(X,temp_M)return result

同样得到结果值

这个图里面每个颜色代表手写数字数据集里面的0-9数字。

ZCA白化

UFLDL中还介绍了基于PCA的白化(whitening或者球化sphering)方法,白化的目标有两个:

  • 特征之间具有尽量少的相关性
  • 特征具有相同的方差

针对第一个目标,前面的使用PCA降维x=uTxx=u^Txx=uTx已经达到了效果。

针对第二个目标,让每个输入特征值都具有单位方差(unit variance),只需要除以特征值的开根号即可:
xpcai=xiλix_{pcai}=\frac{x_i}{\sqrt{\lambda _i}} xpcai​=λi​​xi​​
降维数据的第i列对应第i个特征值。这时候,数据的协方差就是单位阵,这就是所说的PCA白化(数据的不同成分无联系并且具有单位方差)。

但是我们第二个目标其实是具有相同方差,而具有相同的单位方差并不是唯一的一个情况,也可能是具有相同的非单位方差。在ZCA白化中,又对pca白化做了一次左乘:
xzca=uxpcax_{zca}=ux_{pca} xzca​=uxpca​
这样虽然把方差不再是1了,但是变换后的数据更加接近原始数据。

有一点需要注意:PCA可以用于降维(取前面一部分主成分),但是zca必须保持原有的维度不变,zca只做去相关,不做降维。

后记

这个学习笔记主要是针对机器学习里面常见的降维方法PCA进行剖析和逐步实现,具体代码包括手写数字的读取和最终降维图的画图,请参看公众号简介中的github网址。后续将持续更新其它机器学习理论和算法,敬请关注:

PCA、SVD、ZCA白化理论与实现相关推荐

  1. 白化(Whitening): PCA 与 ZCA (转)

    转自:findbill 本文讨论白化(Whitening),以及白化与 PCA(Principal Component Analysis) 和 ZCA(Zero-phase Component Ana ...

  2. 浅谈白化(Whitening) 、PCA白化、ZCA白化

    白化 本节讨论白化(Whitening),以及白化与 PCA(Principal Component Analysis) 和 ZCA(Zero-phase Component Analysis) 的关 ...

  3. Python数据处理 PCA/ZCA 白化(UFLDL教程:Exercise:PCA_in_2DPCA_and_Whitening)

    Python数据处理 PCA/ZCA 白化 参考材料 PCA.白化 以及一份别人的课后作业答案 UFLDL教程答案(3):Exercise:PCA_in_2D&PCA_and_Whitenin ...

  4. 白化(Whitening): PCA白化 ZCA白化

    白化的目的: 白化是一种重要的预处理过程,其目的就是降低输入数据的冗余性,使得经过白化处理的输入数据具有如下性质: (i) 特征之间相关性较低,使数据的不同维度去相关: (ii) 所有特征具有相同的方 ...

  5. 深度学习笔记二:PAC,PAC白化,ZCA白化

    不知道怎么回事, 博客误删了.不想再写了,列下提纲. PCA sigma=(x*x')/size(x,2); [u,s,v]=svd(sigma); xRot = zeros(size(x)); % ...

  6. PCA Whitening ZCA Whitening

    本篇文章主要内容来自于Andrew的书,链接为http://ufldl.stanford.edu/tutorial/unsupervised/PCAWhitening/ PCA PCA也就是主成分分析 ...

  7. SVD奇异值分解(理论与C++实现)

    SVD奇异值分解 前言 理论推导 部分代码实现 前言   奇异值分解(singular value decomposition,以下简称SVD)是线性代数中一种重要的矩阵分解.SVD将矩阵分解为奇异向 ...

  8. PCA SVD opencv 降维对比

    这里选用HOG 特征的数据对比 #include "stdafx.h" #include <opencv.hpp> #include <iostream> ...

  9. 机器学习-白板推导-系列(五)笔记:降维(PCA/SVD/PCoA/PPCA)

    文章目录 0 笔记说明 1 背景 1.1 样本均值 1.2 样本协方差矩阵 2 主成分分析PCA 2.1 最大投影方差 2.2 最小重构距离 2.3 总结 3 SVD分解HX 4 主坐标分析PCoA ...

最新文章

  1. 高级软件工程第七次作业:东理三剑客团队作业-随笔6
  2. python小游戏代码大全-20行python代码的入门级小游戏的详解
  3. buu 密码学的心声
  4. PowerDesigner显示注释字段问题
  5. Java02-day02【运算符(赋值、关系、逻辑、三元、算数、自增自减)、分支语句(顺序结构、if语句)】
  6. [css] 举例说明css的基本语句构成是什么呢?
  7. mysql and 优化_MySQL 优化(六)
  8. 过磅系统_简讯:崇义商砼公司开展无人值守过磅系统业务培训等二则
  9. 最新版python如何安装qt5_Python3 搭建Qt5 环境的方法示例
  10. python中label怎么绑定变量_Kivy将标签文本绑定到变量(仅限Python)
  11. python通过GUI 界面搭建实现嵌套功能_搭建系统|升级基于财务数据的选股工具!从清单中剔除ST股和次新股...
  12. 百战程序员JavaWeb系列教程-监听器视频教程
  13. uniapp开发微信公众号(支付宝支付)
  14. matlab 梯度下降 求偏导,通过计算图求梯度下降中各偏导的推导
  15. stm32驱动TFTLCD液晶屏显示图片+汉字(快速上手,只教怎么用,不讲原理!)
  16. 俄亥俄州立大学哥伦布分校计算机科学,俄亥俄州立大学哥伦布分校什么专业最好?...
  17. 论初唐诗人的历史地位-上官仪、王勃、杨炯、陈子昂、杜审言
  18. Springboot整合Spring Data JPA
  19. div overflow属性
  20. leetcode377组合总和 ⅣC++

热门文章

  1. dovecot mysql_dovecot+mysql
  2. java drawstring字体大小,JAVA中,drawstring 方法的用法,格式是什么啊
  3. [HNOI2003]消防局的设立(贪心)
  4. mysql将查到的数据删除_MySQL数据库的基本操作——增、删、改、查
  5. access denied for_abm怎么样?ACCESS集团携8大国际品牌在进博会首秀,展示abmr 硬核实力!...
  6. LINUX --基本概念和操作
  7. 数据库SQL语言从入门到精通--Part 2--MySQL安装
  8. 数据结构-栈应用之逆波兰表达式(后缀表达式)
  9. linux-shell命令之chown(change owner)【更改拥有者】
  10. Centos7装NVIDIA显卡驱动(GPU)