### 主成份分析(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. [转]MySQL如何设置自动增长序列 SEQUENCE

    原文地址:https://blog.csdn.net/czbqoo01/article/details/70148516 解决思路:由于mysql不带sequence,所以要手写的,创建一张储存seq ...

  2. spring mvc之请求过程源码分析

    简介 上一篇,我们分析了spring mvc启动过程的源码,这一节,来一起分析下在用户请求controller的过程中,spring mvc做了什么事? 一.准备 我写这么一个controller p ...

  3. python学习笔记十四:wxPython Demo

    一.简介 wxPython是Python语言的一套优秀的GUI图形库,允许Python程序员很方便的创建完整的.功能键全的GUI用户界面. wxPython是作为优秀的跨平台GUI库wxWidgets ...

  4. 使用textutil进行文件格式转换

    Typorahtml, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMirror-scroll { ...

  5. plot sin示意图(隐藏刻度,自定义刻度)

    plot sin示意图(隐藏刻度,自定义刻度) 隐藏坐标轴刻度 自定义坐标轴刻度 Code #!/usr/bin/env python # -*- coding: utf-8 -*- import n ...

  6. Go Revel - server.go 源码分析

    之前介绍了 Go Revel - main函数分析 http://www.cnblogs.com/hangxin1940/p/3263775.html 最后会调用 `revel.Run(*port)` ...

  7. MATLAB实现多元线性回归预测

    一.简单的多元线性回归: data.txt ,230.1,37.8,69.2,22.1 ,44.5,39.3,45.1,10.4 ,17.2,45.9,69.3,9.3 ,151.5,41.3,58. ...

  8. ansible示例,离线安装etcd

    一.基础介绍 ========================================================================================== 1. ...

  9. Spring Cloud / Spring Boot There was an unexpected error (type=Unauthorized, status=401). Full authentication is required to access this resource.

    访问EndPoint时会出现没有权限   There was an unexpected error (type=Unauthorized, status=401). Full authenticat ...

  10. IDEA 创建git 分支 拉取分支

        此时只是在本地创建好了分支,修改源代码后add,commit将本地分支提交到远程仓库          分支已创建,其它成员此时就可以从git拉分支