是一种线性、非监督、全局降维算法
两种方法:最大化方差理论、最小平方误差理论
PCA旨在找到数据中的主成分,并利用这些主成分表征原始数据,从而达到降维的目的。假如有数据集是n维的,有m个数据,期望将这m个数据的维度从n维降到某个维度,并尽可能代表原始数据集。
在信号处理领域,一般认为信号具有较大的方差,而噪声具有较小的方差,信号与噪声之比成为信噪比,信噪比越大意味着数据的质量越好,由此得出PCA的目标是最大化投影方差,即让数据在主轴上投影的方差最大。
內积 : ( a 1 , a 2 , ⋯   , a n ) T ⋅ ( b 1 , b 2 , ⋯   , b n ) T = a 1 b 1 + a 2 b 2 + ⋯ + a n b n (a_1,a_2,\cdots,a_n)^\mathsf{T}\cdot (b_1,b_2,\cdots,b_n)^\mathsf{T}=a_1b_1+a_2b_2+\cdots+a_nb_n (a1,a2,⋯,an)T⋅(b1,b2,⋯,bn)T=a1b1+a2b2+⋯+anbn
A ⋅ B = ∣ A ∣ ∣ B ∣ c o s ( a ) A\cdot B=|A||B|cos(a) A⋅B=∣A∣∣B∣cos(a)
A与B的内积等于A到B的投影长度乘以B的模。再进一步,如果我们假设B的模为1,即让|B|=1,那么就变成了:
A ⋅ B = ∣ A ∣ c o s ( a ) A\cdot B=|A|cos(a) A⋅B=∣A∣cos(a)
基
在代数表示方面,我们经常用线段终点的点坐标表示向量,例如上面的向量可以表示为(3,2),这是我们再熟悉不过的向量 表示。
不过我们常常忽略,只有一个(3,2)本身是不能够精确表示一个向量的。我们仔细看一下,这里的3实际表示的是向量在x轴上的投影值是3,在y轴上的投影值是2。也就是说我们其实隐式引入了一个定义:以x轴和y轴上正方向长度为1的向量为标准。那么一个向量(3,2)实际是说在x轴投影为3而y轴的投影为2。注意投影是一个矢量,所以可以为负。
更正式的说,向量(x,y)实际上表示线性组合: x ( 1 , 0 ) T + y ( 0 , 1 ) T x(1,0)^T+y(0,1){T} x(1,0)T+y(0,1)T
此处(1,0)和(0,1)叫做二维空间中的一组基。
所以,要准确描述向量,首先要确定一组基,然后给出在基所在的各个直线上的投影值,就可以了。只不过我们经常省略第一步,而默认以(1,0)和(0,1)为基。
我们之所以默认选择(1,0)和(0,1)为基,当然是比较方便,因为它们分别是x和y轴正方向上的单位向量,因此就使得二维平面上点坐标和向量一一对应,非常方便。但实际上任何两个线性无关的二维向量都可以成为一组基,所谓线性无关在二维平面内可以直观认为是两个不在一条直线上的向量
一般的,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果。(新基按行,向量按列)
( p 1 p 2 ⋮ p R ) ( a 1 a 2 ⋯ a M ) = ( p 1 a 1 p 1 a 2 ⋯ p 1 a M p 2 a 1 p 2 a 2 ⋯ p 2 a M ⋮ ⋮ ⋱ ⋮ p R a 1 p R a 2 ⋯ p R a M ) \begin{pmatrix} p_1 \\ p_2 \\ \vdots \\ p_R \end{pmatrix} \begin{pmatrix} a_1 & a_2 & \cdots & a_M \end{pmatrix}= \begin{pmatrix} p_1a_1 & p_1a_2 & \cdots & p_1a_M \\ p_2a_1 & p_2a_2 & \cdots & p_2a_M \\ \vdots & \vdots & \ddots & \vdots \\ p_Ra_1 & p_Ra_2 & \cdots & p_Ra_M \end{pmatrix} ⎝⎜⎜⎜⎛p1p2⋮pR⎠⎟⎟⎟⎞(a1a2⋯aM)=⎝⎜⎜⎜⎛p1a1p2a1⋮pRa1p1a2p2a2⋮pRa2⋯⋯⋱⋯p1aMp2aM⋮pRaM⎠⎟⎟⎟⎞
其中pi是一个行向量,表示第i个基,aj是一个列向量,表示第j个原始数据记录。
两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。
对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了。不过对于更高维,还有一个问题需要解决。考虑三维降到二维问题。与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。
如果我们还是单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因此,应该有其他约束条件。从直观上说,让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息。
C o v ( a , b ) = 1 m ∑ i = 1 m ( a i 1 − a ˉ 1 ) ( a i 1 − a ˉ 1 ) Cov(a,b)=\frac{1}{m}\sum\nolimits_{i=1}^{m} (a_{i1} - \bar{a}_1)(a_{i1} - \bar{a}_1) Cov(a,b)=m1∑i=1m(ai1−aˉ1)(ai1−aˉ1)
数学上可以用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则:
C o v ( a , b ) = 1 m ∑ i = 1 m a i b i Cov(a,b)=\frac{1}{m}\sum_{i=1}^m{a_ib_i} Cov(a,b)=m1i=1∑maibi
w 为 单 位 方 向 向 量 , 故 w为单位方向向量,故 w为单位方向向量,故 w T w = 1 w^Tw=1 wTw=1
通过上述推导得:
(1)对样本数据进行中心化处理
(2)求样本的协方差矩阵
(3)对协方差矩阵进行特征值分解,特征值按大到小排序
(4)取特征值前d大的对应特征向量
1)将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6)Y=PX即为降维到k维后的数据
映射后
x i , = [ w 1 T x i w 2 T x i ⋮ w d T x i ] x_i^, = \left[ \begin{matrix} w_1^Tx_i \\ w_2^Tx_i \\ \vdots \\ w_d^Tx_i \\ \end{matrix} \right] xi,=⎣⎢⎢⎢⎡w1Txiw2Txi⋮wdTxi⎦⎥⎥⎥⎤
信息占比
η = ∑ i = 1 d λ i 2 ∑ i = 1 n λ i 2 \eta = \sqrt \frac{\sum_{i=1}^d\lambda_i^2}{\sum_{i=1}^n\lambda_i^2} η=∑i=1nλi2∑i=1dλi2
采用此方法求得的最佳投影与上个方法一致,具体可参考百面机器学习第四章
参考:http://blog.codinglabs.org/articles/pca-tutorial.html