05-03 主成分分析(PCA)
更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html
主成分分析(PCA)
一、维数灾难和降维
在KNN算法中曾讲到,对于高维数据,会出现数据样本稀疏、距离计算困难等问题。但是这种问题并不是仅仅针对KNN算法,只是在KNN算法中这种问题会被放大,而其他的机器学习算法也会因为高维数据对训练模型造成极大的障碍,这种问题一般被称为维数灾难(curse of dimensionality)。
解决维数灾难最常用的方法是降维(dimension reduction),即通过某种数学变换将原始高维特征空间转变为一个低维子空间,在这个子空间中样本密度大幅提高,距离计算也变得更容易。
# 维数灾难和降维图例
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from sklearn.decomposition import PCA
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
np.random.seed(0)
X = np.empty((100, 2))
X[:, 0] = np.random.uniform(0, 100, size=100)
X[:, 1] = 0.75 * X[:, 0] + 3. + np.random.normal(0, 10, size=100)
pca = PCA(n_components=1)
X_reduction = pca.fit_transform(X)
X_restore = pca.inverse_transform(X_reduction)
plt.scatter(X[:, 0], X[:, 1], color='g', label='原始数据')
plt.scatter(X_restore[:, 0], X_restore[:, 1],
color='r', label='降维后的数据')
plt.annotate(s='',xytext=(40,60),xy=(65,30),arrowprops=dict(arrowstyle='-',color='b',linewidth=5))
plt.legend(prop=font)
plt.show()
_3_0.png?x-oss-process=style/watermark)
如上图所示,绿点即原始高维空间中的样本点,红点即我们降维后的样本点。由于图中的高维是二维,低维是一维,所以样本在低维空间是一条直线。
接下来我们的目标就是聊一聊如何做到把高维空间样本点映射到低维空间,即各种降维算法。
二、主成分分析学习目标
- 维数灾难和降维
- 主成分分析两个条件
- 基于主成分分析两个条件推导主成分分析
- 核主成分分析
- 主成分分析优缺点
三、主成分分析详解
主成分分析(principal component analysis,PCA)是最常用的一种降维方法,我们已经利用“维数灾难和降维图例”解释了降维的过程,PCA的降维过程则是尽可能的使用数据最主要的特征来代表数据原有的所有特征。但是有没有同学想过为什么使用PCA降维是上图的红点组成的线而不是蓝线呢?这里就需要说到我们PCA的两个条件了。
3.1 主成分分析两个条件
对于“维数灾难和降维图例”中的红线和蓝线我们可以把它看成一个超平面\(S\),理论上红线和蓝线构成的超平面都可以做到对样本特征的降维,但是一般我们希望这种能够做到降维的超平面满足以下两个条件
- 最近重构性:样本点到这个超平面的距离都足够近
- 最大可分性:样本点到这个超平面上的投影尽可能分开
基于最近重构性和最大可分性,就可以得到主成分分析的两种等价推导。
3.2 基于最近重构性推导PCA
3.2.1 主成分分析目标函数
我们首先从最近重构性推导PCA,即样本点到这个超平面的距离足够近。
假设\(m\)个\(n\)维数据\((x^{(1)},x^{(2)},\cdots,x^{(m)})\)都已经进行了中心化,即\(\sum_{i=1}^mx^{(i)}=0\);在假设投影变换后得到的新坐标系为\(\{w_1,w_2,\cdots,w_n\}\),其中\(w_i\)是标准正交基向量,即\(||w_i||=1,w_i^Tw_j=0\),其中\(i\neq{j}\)。
如果把数据从\(n\)维降到\(n'\)维,即丢弃新坐标系中的部分坐标,则新的坐标系为\(\{w_1,w_2,\cdots,w_{n'}\}\),则样本点\(x^{(i)}\)在\(n'\)维坐标系中的投影为
\]
其中\(z_{ij}=w_j^Tx_i\),是\(x_i\)在低维坐标系下第\(j\)维的坐标。
如果我们用\(z^{(i)}\)重构\(x^{(i)}\),则可以恢复的原始数据为
\]
现在考虑整个样本集,既可以获得原样本点\(x_i\)到基于投影重构的样本点\(\hat{x_i}\)之间的距离为
\sum_{i=1}^m{||\hat{x_i}-x_i||}^2 & = \sum_{i=1}^m{||Wz_i-x_i||}^2 \\
& = \sum_{i=1}^m(Wz_i)^T(Wz_i)-2\sum_{i=1}^m(Wz_i)^Tx_i+\sum_{i=1}^mx_i^Tx_i \\
& = \sum_{i=1}^mz_i^Tz_i - 2\sum_{i=1}^mz_i^TW^Tx_i+\sum_{i=1}^mx_i^Tx_i \\
& = \sum_{i=1}^mz_i^Tz_i-2\sum_{i=1}^mz_i^Tz_i+\sum_{i=1}^mx_i^Tx_i \\
& = -\sum_{i=1}^mz_i^Tz_i + \sum_{i=1}^mx_i^Tx_i \\
& = -tr(W^T(\sum_{i=1}^mx_ix_i^T)W)+\sum_{i=1}^mx_i^Tx_i \\
& = -tr(W^TXX^TW)+\sum_{i=1}^mx_i^Tx_i
\end{align}
\]
由于涉及过多矩阵推导,此处不多赘述,看不懂的可以跳过。
其中\(W=(w_1,w_2,\cdots,w_d)\),其中\(\sum_{i=1}^mx_i^Tx_i\)是数据集的协方差矩阵,\(W\)的每一个向量\(w_j\)是标准正交基,而\(\sum_{i=1}^mx_i^Tx_i\)是一个常量,最小化上式等价于
& \underbrace{min}_W\,-tr(W^TXX^TW) \\
& s.t.\,W^TW=I
\end{align}
\]
3.2.2 主成分分析目标函数优化
主成分分析目标函数为
& \underbrace{min}_W\,-tr(W^TXX^TW) \\
& s.t.\,W^TW=I
\end{align}
\]
最小化该目标函数其实并不难,可以发现最小化目标函数对应的\(W\)由协方差矩阵\(XX^T\)最大的\(n'\)个特征值对应的特征向量组成,利用拉格朗日乘子法可得
\]
对\(W\)求导等于0即可得
& -XX^TW+\lambda{W}=0 \\
& XX^TW = \lambda{W}
\end{align}
\]
从上式可以看出,\(W\)是\(XX^T\)的\(n'\)个特征向量组成的矩阵,而\(\lambda\)有若干个特征值组成的矩阵,特征值在对角线上,其余位置为0。当我们将数据集从\(n\)维降到\(n'\)维时,需要找到最大的\(n'\)个特征值对应的特征向量。这个\(n'\)个特征向量组成的矩阵\(W\)即我们需要的矩阵。对于原始数据集,我们只需要用\(z_i=W^Tx_i\),就可以把原始数据集降到最小投影距离的\(n'\)维数据集。
3.3 基于最大可分性推导PCA
从最大可分性出发,样本点\(x_i\)在新空间中超平面的投影是\(W^Tx_i\),如果所有样本点的投影尽可能分开,则应该使投影后样本点的方差最大化。
投影后样本点的方差是\(\sum_{i=1}^mW^Tx_ix_i^TW\),因此目标函数可以写成
& \underbrace{max}_W\,-tr(W^TXX^TW) \\
& s.t.\,W^TW=I
\end{align}
\]
上式其实和基于最近重构性推导PCA的目标函数其实差不多,其中一个是加负号的最小化,一个是最大化。
对基于最大可分性推导得到的目标函数最大化,利用拉格朗日乘子法可以得到
\]
3.4 核主成分分析(KPCA)
PCA中,我们假设存在一个线性的超平面,可以对数据投影,但工业上大多数时候数据都是线性不可分的,这里就需要用到和核SVM一样的思想,即核主成分分析(kernelized PCA,KPCA),是基于核技巧对非线性可分数据进行降维。
KPCA首先会把数据从\(n\)维映射到更高的\(N\)维,让数据线性可分后又会把数据映射回低维\(n'\),即\(n'<n<N\)。
假设我们将在高维特征空间把数据投影到由\(W=(w_1,w_2,\cdots,w_d)\)确定的超平面上,则\(W\)为
\]
其中\(z_i\)是样本点再高维特征空间中的像,即特征分解问题变为
W & = {\frac{1}{\lambda}}(\sum_{i=1}^mz_iz_i^T)W \\
& = \sum_{i=1}^mz_i{\frac{z_i^TW}{\lambda}} \\
& = \sum_{i=1}^mz_i\alpha_i^j
\end{align}
\]
其中\(a_i^j={\frac{1}{\lambda}}z_i^TW\)是\(\alpha_i\)的第\(j\)个分量。
假设\(z_i\)是由原始样本点\(x_i\)通过映射\(\phi\)产生,即\(z_i=\phi(x_i)\),则特征分解问题变为
\]
\(W\)变为
\]
由于我们并不知道\(\phi\)是什么,一般情况下\(\phi\)不需要显示计算,通过核函数转换即可。因此引入核函数
\]
将核函数和\(w_j\)代入特征分解问题,可得
\]
其中\(K\)为\(k\)对应的核矩阵,对于上述特征值分解问题,去\(K\)最大的\(d'\)个特征值对应的特征向量即可。
对于新样本\(x\),他投影后的第\(j\quad(j=1,2,\cdots,d')\)维坐标为
z_j & = W^T\phi(x) \\
& = \sum_{i=1}^m\alpha_i^j\phi(x_i)^T\phi(x) \\
& = \sum_{i=1}^m\alpha_i^jk(x_i,x)
\end{align}
\]
从上述特征分解可以看出,KPCA需要对所有样本求和,因此它的计算开销较大。
四、主成分分析流程
4.1 输入
样本集\(D=\{x_1,x_2,\cdots,x_n\}\);低维空间维数\(n'\)。
4.2 输出
降维后的样本集\(D'\)。
4.3 流程
- 对所有样本进行中心化:\(x_i\leftarrow{x_i}-{\frac{1}{m}}\sum_{i=1}^m{x_i}\)
- 计算样本的协方差矩阵\(XX^T\)
- 对协方差矩阵\(XX^T\)做特征值分解
- 取最大的\(n'\)个特征值所对应的特征向量\((w_1,w_2,\cdots,w_{n'})\),将所有的特征向量标准化后,组成特征向量矩阵\(W\)
- 对样本集中的每一个样本\(x^{(i)}\),转化为新的样本\(z^{(i)}=W^Tx^{(i)}\)
- 得到输出样本集\(n'=(z^{(1)},z^{(2)},\cdots,z^{(m)})\)
降维后低维空间的维数\(n'\)通常是用户事先指定的,一般选择使用交叉验证的方法选择最好的\(n'\)值。对于PCA,有时候也会从重构的角度指定一个降维到的主成分比重阈值\(t\),这个阈值的范围一般是\((0,1]\),然后选取使下式成立的最小\(n'\)值
\]
五、主成分分析优缺点
5.1 优点
- 只需要以方差衡量信息量,不受数据集以外的因素影响
- 主要计算是特征值分解,计算简单,易于实现
5.2 缺点
- 主成分由于是降维得到,没有原始样本那样较强的解释性
- 由于PCA降维会丢掉不少的信息,可能对后续的数据处理有影响
六、小结
PCA作为一个无监督学习的降维方法,只需要对特征值分解,就可以压缩数据,对数据去噪声。但是PCA还是有不少缺点的,针对PCA的缺点,也出现了很多PCA的变种,如解决非线性数据降维的KPCA;解决内存限制的增量的Incremental PCA;解决稀疏数据降维的Sparse PCA等。
由于PCA涉及过多的数学公式,以及有着较强逻辑和空间处理。如果不是很懂可以结合代码然后多看几遍。
05-03 主成分分析(PCA)的更多相关文章
- 一步步教你轻松学主成分分析PCA降维算法
一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...
- SciKit-Learn 可视化数据:主成分分析(PCA)
## 保留版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Le ...
- 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening
主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通过PCA降维,我们能够有效的降低数据的维度,加快运算速度.而白化就是为了使得每个特征能有同 ...
- http://www.cnblogs.com/Matrix54/archive/2012/05/03/2481260.html
http://www.cnblogs.com/Matrix54/archive/2012/05/03/2481260.html
- 线性判别分析(LDA), 主成分分析(PCA)及其推导【转】
前言: 如果学习分类算法,最好从线性的入手,线性分类器最简单的就是LDA,它可以看做是简化版的SVM,如果想理解SVM这种分类器,那理解LDA就是很有必要的了. 谈到LDA,就不得不谈谈PCA,PCA ...
- 降维(一)----说说主成分分析(PCA)的源头
降维(一)----说说主成分分析(PCA)的源头 降维系列: 降维(一)----说说主成分分析(PCA)的源头 降维(二)----Laplacian Eigenmaps --------------- ...
- 主成分分析PCA(转载)
主成分分析PCA 降维的必要性 1.多重共线性--预测变量之间相互关联.多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯. 2.高维空间本身具有稀疏性.一维正态分布有68%的值落于正负标准差之 ...
- 机器学习 —— 基础整理(四)特征提取之线性方法:主成分分析PCA、独立成分分析ICA、线性判别分析LDA
本文简单整理了以下内容: (一)维数灾难 (二)特征提取--线性方法 1. 主成分分析PCA 2. 独立成分分析ICA 3. 线性判别分析LDA (一)维数灾难(Curse of dimensiona ...
- 机器学习课程-第8周-降维(Dimensionality Reduction)—主成分分析(PCA)
1. 动机一:数据压缩 第二种类型的 无监督学习问题,称为 降维.有几个不同的的原因使你可能想要做降维.一是数据压缩,数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,但它也让我们加快 ...
- 主成分分析(PCA)原理及推导
原文:http://blog.csdn.net/zhongkejingwang/article/details/42264479 什么是PCA? 在数据挖掘或者图像处理等领域经常会用到主成分分析,这样 ...
随机推荐
- 微信小程序实现pdf,word等格式文件上传
目前微信只支持从聊天记录里面获取文件 一.前言 目前微信提供了一个接口 wx.chooseMessageFile 它能让用户从聊天记录里面选择一个或者多个文件,然后返回它的一些信息,列入文件的path ...
- PythonI/O进阶学习笔记_3.2面向对象编程_python的封装
前言: 本篇相关内容分为3篇多态.继承.封装,这篇为第三篇 封装. 本篇内容围绕 python基础教程这段: 在面向对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法.使 ...
- 相同类中方法间调用时日志Aop失效处理
本篇分享的内容是在相同类中方法间调用时Aop失效处理方案,该问题我看有很多文章描述了,不过大多是从事务角度分享的,本篇打算从日志aop方面分享(当然都是aop,失效和处理方案都是一样),以下都是基于s ...
- 15 个有用的 MySQL/MariaDB 性能调整和优化技巧
MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...
- docker 搭建小型的node开发环境。
选择daocloud的镜像源----快.不多说 镜像的准备: docker pull docker.io/node 下载node镜像 docker pull daocloud.io/nginx 下载n ...
- Go依赖管理及Go module使用
Go语言的依赖管理随着版本的更迭正逐渐完善起来. 依赖管理 为什么需要依赖管理 最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面.这就导致了同一个库只能保存一个版本的代码.如果不同 ...
- 洛谷 P1219八皇后
把全部,在这251秒,赌上! ——<游戏人生zero> 题目:https://www.luogu.org/problem/P1219 八皇后是一道非常非常非常经典的深搜+回溯的题目. 这道 ...
- CODESYS添加target
1.主界面进入Tools 2.Install,选择安装包
- opencv中IplImage* src = cvLoadImage,错误
在调试这段代码时 IplImage* src = cvLoadImage("D:\\图像\\已处理 - 11.26\\1.jpg", 1); 提示一下错误 引发了异常: 读取访问权 ...
- Java连载32-对象、类及其关系与定义
一.采用面向对象的方式开发一个软件,生命周期之中: (1)面向对象的分析:OOA (2)面向对象的设计:OOD (3)面向对象的编程:OOP 二.类 定义:类在现实世界世界之中是不存在的,是一个模板, ...