前言
这次介绍,主成分分析英文名为Principal components analysis,简称为PCA,而这次一样自己的观点简单的叙述,但还是会介绍一些数学公式,但其根本也能用最后结果简单的说明。
投影向量
参考[1]介绍主要有两种向量定义,一为代数定义,二为几何定义。
代数定义
使用点对点相乘后加总,而这里用矩阵的方式如下图,A的反转矩阵乘上B(原始数据为垂直列向量,所以将A做转置),结果与向量点对点相同。
几何定义
在欧几里得定义点积[1]的公式为,(来源:[1]),与上列代数定义两者相等,而代数除上向量a*b长度后则可以得到角度。
纯量投影
在欧几里得当中垂直投影如下图,向量a长度乘上cos theta,即可得到邻边,而邻边就是a投影在b的长度。
投影,来源:[1]。
PCA 公式
假设矩阵资料为A,投影矩阵为B,第一步先将每个垂直列零均值化(也能水平行,只是计算要反转矩阵),此步骤能将计算变异数的偏移值归零,在二维意旨通过原点(能用直线公式理解为,y=ax + b,b为0)。这里介绍两种推导方式。
方法一
[2]的推导方式,没有方法二较详细推导,也简单容易理解。
变异数
1.投影做内积公式。
在AdaBoost已经有介绍倒变异数这里就跳过公式。在二维当中PCA降维利用了垂直投影到B向量并计算距离的方式(计算距离从二维变一维),来代替目前的(x,y)表示方式,如下图。红色线为零均值化。
投影。
使用变异数来计算投影后差异,之后再找出向量B的最大极值(投影损失最少),计算变异数的公式如下,(偏移量为0因做过零均值化)。
这里使用矩阵所以公式如下图,B转置乘上A转为水平行,所以右边转置,转置后使用特性,(B转置A)转置=A转置B详细请看[4]。
由上述可得知,公式最后为B零均值化的共变异数矩阵B转置,共变异数矩阵在影像风格转换也有介绍过(协方差矩阵)。
拉格朗日乘数
2.求投影到B时变异数最大公式(投影越大LOSS也相对较少)。
求最大化的条件为B^2为1(因条件模长=1),如下图。
投影,来源:[2]。
求最大化可使用拉格朗日乘数来取得最佳解,可先看[5]的例子了解公式使用,有兴趣也可以看推导。求最大值所以扣掉特徵如下方公式。
求微分,即可得到极值,可以看到这里的极值就是共变异数矩阵的特徵值。
带入原式,这里可能特徵值为常量所以矩阵可交换,如下图。
方法二
方法二是来自于[3],这里用更简单的方式解释,让读者能更加理解,而[3]是使用样本标準差下去计算所以平均的分母都会-1。
样本平均数向量
下面是证明样本平均数公式(x - a),a=m(样本的平均)。如下图所式。
将原先公式x加上m,a减掉m(因为要证明所以将m代数方式带入,并不会影响结果)。展开,当作矩阵所以有的乘法可转为转置矩阵。整理公式。因假设a=m,所以后项都是0,最终解果(x - a)^2 = (x - m)^2,也就是所谓的离差[2],离差AdaBoost有介绍过。
样本平均数向量,来源:[3]。
均方误差(方法一计算变异量方式)
此方法为了计算误差,所以进行投射到一直线上面,而条件为,意指映射到模长=1。一开始都先将资料零均值化使得资料总和=0,而原先x可由映射后的权重来还原,公式为,
,w为向量,c为纯量,m和x的距离为|c|,这公式能理解出映射的简易过程(能用直线公式来看待会更加容易理解)。
既然知道大概映射的过程,接着就是要求出c这个值,计算出误差总和最小的即是我们要找的c,这时候就可以使用偏微分=0(变化等于0,在人工智慧章节有解释过),公式如下图。

来源[3]。
对c求偏微分(极小值,最小变化)。
1.求偏微分。
2.得出相等式子。
来源[3]。
将最小化相等公式带入原先公式(取代x - m)。
整理公式,并将c改为(x - m)。展开左边sigma,并将w转置*(x - m)位置互换,互换则两者都要转置。整理公式,使得中间为x零均值化的共变异数矩阵(对称半正定性质,详细说明可上维基)。
来源[3]。
这里的S即是共变异数矩阵,左边sigma为扣掉均值总和=0。而[3]解释数据集的总变异量 (即离差平方和)是一常数,所以最小化E(w)等价于最大化 w转置SW。而这里简单解释为,因E(w) = -w转置SW,所以w转置SW最大化等于最小化E(w)。
来源[3]。
求最大即带入方法一所讲到的拉格朗日乘数,求偏微分,即可得到S的对应公式。
来源[3]。
解到这一步就可以得知w为特徵向量,所以只要求出共变异数矩阵的特徵向量和特徵值即可。
PCA降维
以上介绍的公式只需要将特徵值大小排序,再取出指定维度n的前n个特徵向量来做相乘。而最终所损失的量为,指定n维的特徵值和/全部特徵值和,如下图。
来源[3]。
PCA 实作
映射向量图
首先来可视化映射向量,这里有两个红色向量如下图,可以想像为较长的是x映射,短的为y映射,因为x的值分散较大所以特徵值会较大,而y则较小。如下图。
import numpy as npimport matplotlib.pyplot as pltsize = 100data_x = np.random.uniform(-10.0, 10.0, size=(size, 1))data_y = data_x - np.random.uniform(-2.0, 2.0, size=(size, 1))data = np.hstack((data_x, data_y))cov_matrix = np.cov(data,rowvar=0)eig_val, eig_vec = np.linalg.eig(cov_matrix)plt.plot([eig_vec[0, 0] * 12,0], [eig_vec[0, 1] * 12,0],color='red')plt.plot([eig_vec[1, 0] * 2,0], [eig_vec[1, 1] * 2,0],color='orange')plt.plot(data[:,0],data[:,1], 'o', color='blue')plt.xlim(-12, 12)plt.ylim(-12, 12)plt.show()
PCA
接着实作PCA,使用上述的公式,最后并带回计算是否会是原始资料。结果如下图。
黑点为映射资料。
eig_val_sort_indexs[:2]
取出前两个特徵向量做乘法(降一维改1),结果即是映射后资料。依照上述公式,乘上反转矩阵(推导时先乘矩阵再乘上原始矩阵,主要看资料是行还是列),m+cw,c=w转置*(资料零均值),即是原先数据。import numpy as npimport matplotlib.pyplot as pltdef zero_mean(data): mean = np.mean(data, axis=0) zero_data = data - mean return zero_datasize = 100data_x = np.random.uniform(-10.0, 10.0, size=(size, 1))data_y = data_x - np.random.uniform(-2.0, 2.0, size=(size, 1))data = np.hstack((data_x, data_y))zero_data = zero_mean(data)cov_data = np.cov(zero_data, rowvar=0)eig_val, eig_vec = np.linalg.eig(cov_data)eig_val_sort_indexs = np.argsort(-eig_val)eig_vec_sort = eig_vec[:,eig_val_sort_indexs[:2]]mapping_data =np.dot(zero_data, eig_vec_sort) print(zero_data)print(np.dot(mapping_data, eig_vec_sort.T))plt.plot([eig_vec[0, 0] * 12,0], [eig_vec[0, 1] * 12,0],color='red')plt.plot([eig_vec[1, 0] * 2,0], [eig_vec[1, 1] * 2,0],color='orange')plt.plot(zero_data[:,0],zero_data[:,1], 'o', color='blue')plt.plot(mapping_data[:,0],mapping_data[:,1], 'o', color='black')plt.xlim(-12, 12)plt.ylim(-12, 12)plt.show()
总结
方法二的方法很详细,最后推导得知w为特徵向量,最后总结出简单的解释。(解释只是换个想法,实际上都要用以上数学来解释,若上述推导能理解,这里能跳过)。
将资料零均质化,解释为在二维中为了将特徵线通过原点,意旨任何资料都是通过原点,类似正规化。共变异数矩阵,解释为在二维中计算x和y之间的离散数值。计算出离散数值特徵,解释为在二维中x和y两者的影响哪个较大,并可得到两者的独立特徵向量。资料乘上特徵向量,解释为在二维中在独立的向量当中是如何表示。结语
在很久之前就听过PCA,但每次都是看看,这次终于有机会将它完成,接着有时间还会继续介绍各种算法,可能有的解释并不是很好,但这主要是自己往后回来看原理能快速理解,请多包涵。有问题或错误欢迎纠正讨论。
参考文献
[1]维基百科(2019) 内积 from: https://zh.wikipedia.org/wiki/%E7%82%B9%E7%A7%AF(2019.05.20)
[2]Tommy Huang(2018) 机器/统计学习:主成分分析(Principal Component Analysis, PCA) from: https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8-%E7%B5%B1%E8%A8%88%E5%AD%B8%E7%BF%92-%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90-principle-component-analysis-pca-58229cd26e71
[3]ccjou(2013) 主成分分析 | 线代启示录 form: https://ccjou.wordpress.com/2013/04/15/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90/
[4]ccjou(2013) 主成分分析 | 转置矩阵的意义 form:https://ccjou.wordpress.com/2010/05/20/%E8%BD%89%E7%BD%AE%E7%9F%A9%E9%99%A3%E7%9A%84%E6%84%8F%E7%BE%A9/
[5]维基百科(2019) 拉格朗日乘数 from: https://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E4%B9%98%E6%95%B0#%E8%AF%81%E6%98%8E
[6]https://upmath.me/