### 主成份分析(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推导的更多相关文章

  1. 主成份分析PCA

    Data Mining 主成分分析PCA 降维的必要性 1.多重共线性--预测变量之间相互关联.多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯. 2.高维空间本身具有稀疏性.一维正态分布有6 ...

  2. 吴裕雄 python 机器学习——主成份分析PCA降维

    # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...

  3. PCA主成份分析

    1   背景介绍 真实的训练数据总是存在各种各样的问题: 1. 比如拿到一个汽车的样本,里面既有以“千米/每小时”度量的最大速度特征,也有“英里/小时”的最大速度特征,显然这两个特征有一个多余. 2. ...

  4. principal components analysis 主成份分析

    w http://deeplearning.stanford.edu/wiki/index.php/主成份分析 主成分分析(PCA)及其在R里的实现 - jicf的日志 - 网易博客  http:// ...

  5. pca主成份分析方法

    1.应用pca的前提 应用pca的前提是,连续信号具有相关性.相关性是什么,是冗余.就是要利用pca去除冗余. 2.pca的定义 pca是一种去除随机变量间相关性的线性变换.是一种常用的多元数据分析方 ...

  6. Spark 2.0 PCA主成份分析

    PCA在Spark2.0中用法比较简单,只需要设置: .setInputCol(“features”)//保证输入是特征值向量 .setOutputCol(“pcaFeatures”)//输出 .se ...

  7. PCA主成份分析学习记要

    前言 主成份分析,简写为PCA(Principle Component Analysis).用于提取矩阵中的最主要成分,剔除冗余数据,同时降低数据纬度.现实世界中的数据可能是多种因数叠加的结果,如果这 ...

  8. PCA--主成份分析

    主成份分析(Principle Component Analysis)主要用来对数据进行降维.对于高维数据,处理起来比较麻烦,而且高维数据可能含有相关的维度,数据存在冗余,PCA通过把高维数据向低维映 ...

  9. 主元分析PCA理论分析及应用

    首先,必须说明的是,这篇文章是完完全全复制百度文库当中的一篇文章.本人之前对PCA比较好奇,在看到这篇文章之后发现其对PCA的描述非常详细,因此迫不及待要跟大家分享一下,希望同样对PCA比较困惑的朋友 ...

随机推荐

  1. 初学SSH 配置+错误总结

    初学java web 一上手就接触ssh,前段时间,断断续续配置好了ssh,今天从Hibernate入手开始学习.先总结今天遇到的问题. 配置链接的是sqlserver的数据库,首先是下载了一个jdb ...

  2. mysql-connector-java-5.1.22下载

    java连接mysql时,需要安装驱动.如果未安装,会出现找不到“com.mysql.jdbc.Driver”的错误. 最新版驱动是:mysql-connector-java-5.1.22 下载地址: ...

  3. 基于html5背景图片自适应代码

    基于html5背景图片自适应代码是一款背景不随滚动条滚动,会根据分辨率不同自动匹配对应的背景图片.效果图如下: 在线预览   源码下载 实现的代码. css代码: .jawbone-hero .jaw ...

  4. mysql 乱码解决方案

    如何解决MYSQL数据中文乱码问题? 第一种方法,总结: 经常更换虚拟主机,而各个服务商的MYSQL版本不同,当导入数据后,总会出现乱码等无法正常显示的问题,查了好多资料,总结出自己的一点技巧: WI ...

  5. 通过USB连接越狱iPhone,SSH进入设备

    通过USB连接越狱iPhone,SSH进入设备html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .Co ...

  6. MAC版Eclipse的常用快捷键

    一.Command类 Command+1 快速修复 Command+d 删除当前行 Command+Option+↓ 复制当前行到下一行 Command+Option+↑ 复制当前行到上一行 Comm ...

  7. Go Revel - Validation(验证)

    Revel提供了内建函数用于验证参数.它提供了: 一个`Validation`上下文集合来管理验证错误信息(键与消息内容) 辅助函数用于检查数据并将错误信息放入上下文 一个模板函数用于从`Valida ...

  8. python -修改文件中某一行

    写代码写错了顺序,所以想办法把x,y坐标调换回来 def change_ptsxy(fileName): fp = open(fileName) i = file_data = "" ...

  9. Java通过JDBC进行简单的增删改查(以MySQL为例)

    Java通过JDBC进行简单的增删改查(以MySQL为例) 目录: 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JD ...

  10. 【javascript】设为首页——setHome

    原生 js 编写,兼容 ie,火狐和谷歌. 函数如下: function setHome(obj,url){ try{ obj.style.behavior = 'url(#default#homep ...