[笔记]主成分分析(PCA)

前言

这次介绍,主成分分析英文名为Principal components analysis,简称为PCA,而这次一样自己的观点简单的叙述,但还是会介绍一些数学公式,但其根本也能用最后结果简单的说明。

投影向量

参考[1]介绍主要有两种向量定义,一为代数定义,二为几何定义。

代数定义

使用点对点相乘后加总,而这里用矩阵的方式如下图,A的反转矩阵乘上B(原始数据为垂直列向量,所以将A做转置),结果与向量点对点相同。
http://img2.58codes.com/2024/20110564rJPgjGEA3h.png

几何定义

在欧几里得定义点积[1]的公式为,http://img2.58codes.com/2024/20110564hAZZIh76Ma.png(来源:[1]),与上列代数定义两者相等,而代数除上向量a*b长度后则可以得到角度。

纯量投影

在欧几里得当中垂直投影如下图,向量a长度乘上cos theta,即可得到邻边,而邻边就是a投影在b的长度。

http://img2.58codes.com/2024/20110564sdgHlQQwOM.png
投影,来源:[1]。

PCA 公式

假设矩阵资料为A,投影矩阵为B,第一步先将每个垂直列零均值化(也能水平行,只是计算要反转矩阵),此步骤能将计算变异数的偏移值归零,在二维意旨通过原点(能用直线公式理解为,y=ax + b,b为0)。这里介绍两种推导方式。

方法一

[2]的推导方式,没有方法二较详细推导,也简单容易理解。

变异数

1.投影做内积公式。
在AdaBoost已经有介绍倒变异数这里就跳过公式。在二维当中PCA降维利用了垂直投影到B向量并计算距离的方式(计算距离从二维变一维),来代替目前的(x,y)表示方式,如下图。红色线为零均值化。

http://img2.58codes.com/2024/20110564ynC7sxCIKH.png
投影。

使用变异数来计算投影后差异,之后再找出向量B的最大极值(投影损失最少),计算变异数的公式如下,(偏移量为0因做过零均值化)。
http://img2.58codes.com/2024/20110564fNz7vnMgKg.png

这里使用矩阵所以公式如下图,B转置乘上A转为水平行,所以右边转置,转置后使用特性,(B转置A)转置=A转置B详细请看[4]。
http://img2.58codes.com/2024/20110564PDkMZEeyR7.png

由上述可得知,公式最后为B零均值化的共变异数矩阵B转置,共变异数矩阵在影像风格转换也有介绍过(协方差矩阵)。

拉格朗日乘数

2.求投影到B时变异数最大公式(投影越大LOSS也相对较少)。
求最大化的条件为B^2为1(因条件模长=1),如下图。

http://img2.58codes.com/2024/20110564cXrpJXEC1j.png
投影,来源:[2]。

求最大化可使用拉格朗日乘数来取得最佳解,可先看[5]的例子了解公式使用,有兴趣也可以看推导。求最大值所以扣掉特徵如下方公式。
http://img2.58codes.com/2024/20110564RL6H0OO0Ih.png

求微分,即可得到极值,可以看到这里的极值就是共变异数矩阵的特徵值。
http://img2.58codes.com/2024/20110564CVpPv192zK.png

带入原式,这里可能特徵值为常量所以矩阵可交换,如下图。
http://img2.58codes.com/2024/20110564OQP3DJk2hI.png

方法二

方法二是来自于[3],这里用更简单的方式解释,让读者能更加理解,而[3]是使用样本标準差下去计算所以平均的分母都会-1。

样本平均数向量

下面是证明样本平均数公式(x - a),a=m(样本的平均)。如下图所式。

将原先公式x加上m,a减掉m(因为要证明所以将m代数方式带入,并不会影响结果)。展开,当作矩阵所以有的乘法可转为转置矩阵。整理公式。

因假设a=m,所以后项都是0,最终解果(x - a)^2 = (x - m)^2,也就是所谓的离差[2],离差AdaBoost有介绍过。

http://img2.58codes.com/2024/20110564vZd8nfJnJE.png
样本平均数向量,来源:[3]。

均方误差(方法一计算变异量方式)

此方法为了计算误差,所以进行投射到一直线上面,而条件为https://chart.googleapis.com/chart?cht=tx&chl=%24%24%20%5Cmid%5Cmid%20W%5Cmid%5Cmid%3D1%20%24%24,意指映射到模长=1。一开始都先将资料零均值化使得资料总和=0,而原先x可由映射后的权重来还原,公式为,https://chart.googleapis.com/chart?cht=tx&chl=%24%24x%20%3D%20m%20%2B%20cw%20%24%24,w为向量,c为纯量,m和x的距离为|c|,这公式能理解出映射的简易过程(能用直线公式来看待会更加容易理解)。
既然知道大概映射的过程,接着就是要求出c这个值,计算出误差总和最小的即是我们要找的c,这时候就可以使用偏微分=0(变化等于0,在人工智慧章节有解释过),公式如下图。

将上述投影反推x公式扣掉原先x,使用均方误差计算。整理公式,使得x-m再一起方便后续处理。展开公式。
http://img2.58codes.com/2024/20110564WBqG0JDeiN.png
来源[3]。

对c求偏微分(极小值,最小变化)。
1.求偏微分。
2.得出相等式子。
http://img2.58codes.com/2024/201105648MMfiKx4U5.png
来源[3]。

将最小化相等公式带入原先公式(取代x - m)。

整理公式,并将c改为(x - m)。展开左边sigma,并将w转置*(x - m)位置互换,互换则两者都要转置。整理公式,使得中间为x零均值化的共变异数矩阵(对称半正定性质,详细说明可上维基)。
http://img2.58codes.com/2024/20110564qV2qSr9E1C.png
来源[3]。

这里的S即是共变异数矩阵,左边sigma为扣掉均值总和=0。而[3]解释数据集的总变异量 (即离差平方和)是一常数,所以最小化E(w)等价于最大化 w转置SW。而这里简单解释为,因E(w) = -w转置SW,所以w转置SW最大化等于最小化E(w)。
http://img2.58codes.com/2024/201105647DV0vP6cJc.png
来源[3]。

求最大即带入方法一所讲到的拉格朗日乘数,求偏微分,即可得到S的对应公式。
http://img2.58codes.com/2024/20110564nIRd9ZeJBO.png
来源[3]。

解到这一步就可以得知w为特徵向量,所以只要求出共变异数矩阵的特徵向量和特徵值即可。

PCA降维

以上介绍的公式只需要将特徵值大小排序,再取出指定维度n的前n个特徵向量来做相乘。而最终所损失的量为,指定n维的特徵值和/全部特徵值和,如下图。

http://img2.58codes.com/2024/20110564Eo5G7Q0FzQ.png
来源[3]。

PCA 实作

映射向量图

首先来可视化映射向量,这里有两个红色向量如下图,可以想像为较长的是x映射,短的为y映射,因为x的值分散较大所以特徵值会较大,而y则较小。如下图。
http://img2.58codes.com/2024/20110564NzLdd1Ic7p.png

建立资料。计算共变异数矩阵。得取特徵量和特徵向量(可以自己实作,但用原本作法会较慢,numpy有使用效率较高的公式,有点忘记使用那些了,有兴趣可上网查询)。画出结果。
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,使用上述的公式,最后并带回计算是否会是原始资料。结果如下图。

http://img2.58codes.com/2024/20110564yNv65QNDYJ.png
黑点为映射资料。

创建资料。零均质化。计算共变异矩阵。计算特徵值和特徵向量。依照特徵值排序特徵向量。这里选择维度为2,所以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/


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章