### 主成份分析(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. python matplotlib 画图

    import numpy as np import matplotlib.pyplot as plt from pylab import * numpy 常用来组织源数据: 使用 plot 函数直接绘 ...

  2. Android NFC近场通信2——NFC标签调度

    上面一篇文章简单介绍了NFC的背景和技术应用,今天主要是讲解一下NFC如何发起通信和标签通信(主要是翻译android官网的资料,中间加入个人心得). NFC总是在一个发起者和一个被动目标之间发生.发 ...

  3. [转]Oracle中Hint深入理解

    原文地址:http://czmmiao.iteye.com/blog/1478465 Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明 ...

  4. AlphaGo论文的译文,用深度神经网络和树搜索征服围棋:Mastering the game of Go with deep neural networks and tree search

    转载请声明 http://blog.csdn.net/u013390476/article/details/50925347 前言: 围棋的英文是 the game of Go,标题翻译为:<用 ...

  5. Thinkphp CURD中的where方法

    今天来给大家讲下查询最常用但也是最复杂的where方法,where方法也属于模型类的连贯操作方法之一,主要用于查询和操作条件的设置.where方法的用法是ThinkPHP查询语言的精髓,也是Think ...

  6. centos 6.5 升级php到5.6.17版本

    1. 下载php5.6.17版本:编译安装, ./configure --prefix=/usr/local/php5. --with-config-/etc --with-mysql=/usr/lo ...

  7. 解决MYSQL ERROR 1045 (28000)问题

    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)   Red Hat Enterpr ...

  8. 【进阶修炼】——改善C#程序质量(5)

    71, 区分异步和多线程的应用场景. 计算机的很多硬件,如硬盘,光驱,声卡,网卡都有DMA(Direct Memory Access)功能,它可以不占用cpu的资源,而异步的提出恰恰就是基于这个的.而 ...

  9. freemarker自己定义标签报错(二)

    freemarker自己定义标签 1.错误描写叙述 freemarker.core.ParseException: Unexpected end of file reached. at freemar ...

  10. Graph-BFS-Fly-图的广度优先遍历-最小转机问题

    #include <iostream> #include <queue> using namespace std; /* 5 7 1 5 1 2 1 3 2 3 2 4 3 4 ...