【主成份分析】PCA推导
### 主成份分析(Pricipal components analysis PCA)
假设空间$R^{n}$中有m个点{$x^{1},......,x^{n}$},希望压缩,对每个$x^{i}$都有一个向量$c^{i} \in R^{l}$,并且l < m(所以才压缩。)。所以需要找到一个编码函数f(x) = c 和一个解码函数$g(c) \approx x$。
在PCA中我们用矩阵乘法作为解码器$ g(c) = Dc ,D \in R^{n \times l}$,约定D中所有列向量都有单位范数,同时限制D的列向量彼此正交。
为了得到最优的编码$c^{*}$,希望平方L2范数最小:$c^{*} = arg min_{c}||x-g(c)||^{2}_{2} \tag{2.55}$。选择L2平方范数的原因是计算简便,可以用向量点积计算。
公式2.55可以简化为$$c^{*} =(x-g(c))^{T}(x-g(c)) \tag{2.56}$$
展开公式2.56,在利用分配率,标量的转置等于自己等性质以及省略与c无关的项,可得:$$c^{*} = arg min_{c}-2x^{T}g(c)+g(c)^{T}g(c) \tag{2.57}$$
给公式2.57带入g(c)的定义可得$$c^{*} = arg min_{c}-2x^{T}Dc + c^{T}D^{T}Dc \tag{2.60}$$
由于D各列向量之间彼此正交,且范数为1,$D^{T}D = I$,所以公式2.60简化为$c^{*} = arg min_{c}-2x^{T}Dc + c^{T}c \tag{2.62}$
用向量微积分来解决最优化问题,公式2.62等价于
$$\nabla_{c}(-2x^{T}Dc + c^{T}c) =0 \tag{2.63}$$
> 参考常用矩阵微分公式:https://wenku.baidu.com/view/ff79346a55270722192ef7ff.html
公式2.63等价于
$$-2D^{T}x + 2c =0 \tag{2.64}$$
$$c = f(x) = D^{T}x \tag{2.66}$$
重新构建回x的操作为
$$x^{*} = r(x) = g(c) = Dc = DD^{T}x \tag{2.67}$$
通过上述推导,编码器(公式2.66)和解码器(公式2.67)都有了,接下来问题是如何找到矩阵D。
目标函数是最小化编码再解码后所有点与原始点的误差,即最小化所有点的误差矩阵的Frobenius范数。
$$D^{*} =arg min_{D} \sqrt{\sum_{i,j}(x_{j}^{(i)} - r(x^{(i)})_{j})^{2}} ,在D各列向量正交且范数为1的前提下 D^{T}D = I_{l} \tag{2.68}$$
上述公式解释为在原数据点x,和编码再解码后的的数据点的距离之和最小。
把所有的点向量堆叠成一个矩阵(这里就可以转一个一个样本的串行运算为并行运算),记为$X \in R^{n \times m}$(注:此处与原书表示方法不同,可以更简便)
则公式2.68可表示为:
$$D^{*} =arg min_{D} ||X - DD^{T}X||^{2}_{F} \tag{2.69}$$
考虑到Frobenius范数的一个性质:$||A||_{F} = \sqrt{Tr(AA^{T})}$,则:
$$D^{*} =arg min_{D} Tr((X - DD^{T}X)(X - DD^{T}X)^{T}) \tag{2.70}$$
将公式2.70展开,并去除与D无关的项,在考虑到迹运算可以顺序调换位置的特性$Tr(\prod_{i=1}^{n}F^{i}) = Tr(F^{n}\prod_{i=1}^{n-1}F^{i})$以及转置运算的特性:$(AB)^{T} = B^{T}A^{T}$,则等价于
$$argmin_{D}-Tr(D^{T}XX^{T}D) \tag{2.71}$$
考察这里公式2.71和原书的2.84,因为这里定义的X纬度和书中相反,所以结论正好一致。
公式2.71的最优化问题可以通过特征分解来求解,最优的D是$XX^{T}$(注意这里的x是书中x的转置)最大特特征值对应的特征向量。
```python
import numpy as np
from sklearn.decomposition import PCA
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components=2)
pca.fit(X)
# PCA(copy=True, iterated_power='auto', n_components=2, random_state=None,
# svd_solver='auto', tol=0.0, whiten=False)
print(pca.explained_variance_ratio_)
# [ 0.99244... 0.00755...]
print(pca.singular_values_)
#[ 6.30061... 0.54980...]
```
PCA和SVD的区别:
> https://www.zhihu.com/question/38319536/answer/131029607
> SVD可以认为是PCA的一种计算方法,PCA中的特征值和SVD中的奇异值是有关系的。
【主成份分析】PCA推导的更多相关文章
- 主成份分析PCA
Data Mining 主成分分析PCA 降维的必要性 1.多重共线性--预测变量之间相互关联.多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯. 2.高维空间本身具有稀疏性.一维正态分布有6 ...
- 吴裕雄 python 机器学习——主成份分析PCA降维
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...
- PCA主成份分析
1 背景介绍 真实的训练数据总是存在各种各样的问题: 1. 比如拿到一个汽车的样本,里面既有以“千米/每小时”度量的最大速度特征,也有“英里/小时”的最大速度特征,显然这两个特征有一个多余. 2. ...
- principal components analysis 主成份分析
w http://deeplearning.stanford.edu/wiki/index.php/主成份分析 主成分分析(PCA)及其在R里的实现 - jicf的日志 - 网易博客 http:// ...
- pca主成份分析方法
1.应用pca的前提 应用pca的前提是,连续信号具有相关性.相关性是什么,是冗余.就是要利用pca去除冗余. 2.pca的定义 pca是一种去除随机变量间相关性的线性变换.是一种常用的多元数据分析方 ...
- Spark 2.0 PCA主成份分析
PCA在Spark2.0中用法比较简单,只需要设置: .setInputCol(“features”)//保证输入是特征值向量 .setOutputCol(“pcaFeatures”)//输出 .se ...
- PCA主成份分析学习记要
前言 主成份分析,简写为PCA(Principle Component Analysis).用于提取矩阵中的最主要成分,剔除冗余数据,同时降低数据纬度.现实世界中的数据可能是多种因数叠加的结果,如果这 ...
- PCA--主成份分析
主成份分析(Principle Component Analysis)主要用来对数据进行降维.对于高维数据,处理起来比较麻烦,而且高维数据可能含有相关的维度,数据存在冗余,PCA通过把高维数据向低维映 ...
- 主元分析PCA理论分析及应用
首先,必须说明的是,这篇文章是完完全全复制百度文库当中的一篇文章.本人之前对PCA比较好奇,在看到这篇文章之后发现其对PCA的描述非常详细,因此迫不及待要跟大家分享一下,希望同样对PCA比较困惑的朋友 ...
随机推荐
- Mybatis generator 自动生成代码(2)
最近准备开始做一个项目,需要开始手动创建sql,于是将Mybatis generator 工具功能强化了下. 首先,这里引入到版本一点的包 <dependency> <groupId ...
- JQUERY的给Check全选功能
//给Checkbox提供全选功能 $("#checkall").click(function(){ if(this.checked){ $("input[name='c ...
- Linux shell 常用 加减乘除记录
+ 运算 count=0 let count=count+2 let count+=2 echo $count - 运算 count=0 let count=count-2 let count-=2 ...
- [uart]linux uart应用层配置
http://www.raviyp.com/embedded/189-serial-port-programming-in-linux-using-c-working-code
- linux系统管理命令(五)
[教程主题]:1.系统管理命令 [1.1]用户和组管理 在Linux操作系统中,任何文件都归属于某一特定的用户,而任何用户都隶属于至少一个用户组.用户是否有权限对某文件进行访问.读写以及执行,受到系统 ...
- 初入android驱动开发之字符设备(四-中断)
上一篇讲到android驱动开发中,应用是怎样去操作底层硬件的整个流程,实现了按键控制led的亮灭.当然,这是一个非常easy的实例,只是略微演变一下,就能够得到广泛的应用. 如开发扫描头,应用透过监 ...
- Android指南 - 主题
译者注:theme(主题)和style(样式)是专用术语,下面对这两个词汇不在使用中文词汇. theme 是安卓的一种机制,用于为应用程序和activity提供一致的样式(style).样式s ...
- Android训练课程(Android Training) - NFC基础
NFC 基础 本文档介绍了在Android上的基本的NFC任务.它说明了如何发送和接收的NDEF消息(NDEF messages)的形式的表单里包含的NFC数据(NFC data),并介绍Androi ...
- compareTo返回值为-1 、 1 、 0 的排序问题
1.什么是Comparable接口 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 .实现此接口的对象列表(和数组)可 ...
- linux update & upgrade
Linux升级命令有两个分别是yum upgrade和yum update, 这个两个命令是有区别的: 复制代码 代码如下: yum -y update 升级所有包同时也升级软件和系统内核 复制代码 ...