算法概述:
主成分分析或者主元分析是一种掌握毐主要矛盾的统计分析方法,它可以从多元事务中解析出主要影响因素。简单来说,就是将高维的数据集映射到低维的空间之中,同时尽可能的保留更多的变量。
前置芝士:
1.向量内积
2.投影
3.基
4.方差
5.协方差
6.矩阵特征值,特征向量
7.矩阵对角化
墙裂推荐知乎大佬托比欧对于线性代数知识的讲解:https://zhuanlan.zhihu.com/p/113501803
算法过程:
首先我们想要实现降维操作,如二维变成一维度,我们必须找到一组基,将向量投影到这个基上,我们得到的结果就是降维后的结果。
首先第一步我们要将各个维度上的值减去其均值!!!(方便后面求方差、标准差)
方差:
但是如何知道我们选这组基的好坏呢(因为在降维的过程中肯定伴随着数据的丢失 例如:二维映射到一维上会有重叠的点)?
对降维后的点求其该维度上的方差,其方差越大表示数据的离散程度越高,重叠的点就越少,降维的效果就更好。方差的公式定义为:
协方差:
对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了。不过对于更高维,还有一个问题需要解决。考虑三维降到二维问题。与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。
如果我们还是单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因此,应该有其他约束条件。从直观上说,让两个维度尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个维度不是完全独立,必然存在重复表示的信息。
数学上可以用两个字段的协方差表示其相关性,由于已经让每个维度均值为0(见第一步),则协方差定义为:
协方差矩阵优化:
假设我们只有a和b两个维度,那么我们将它们按行组成矩阵X
我们取 X ∗ X T X^{\ast }X^{T} X∗XT 得到:
奇迹出现了!这个矩阵对角线上的两个元素分别是两个字段的方差,而其它元素是a和b的协方差。两者被统一到了一个矩阵的。
根据矩阵相乘的运算法则,这个结论很容易被推广到一般情况:
设我们有m个n维数据记录,将其按列排成n乘m的矩阵X,设 C = 1 m X ∗ X T C=\dfrac{1}{m}X^{\ast }X^{T} C=m1X∗XT,则C是一个对称矩阵,其对角线分别个各个字段的方差,而第i行j列和j行i列元素相同,表示i和j两个字段的协方差。
**总结一下:**协方差为0保证了不同维度之间没有相关性。方差尽可能的大保证了同维度间的数据尽可能分散不重叠。
协方差矩阵对角化:
根据上述推导,我们发现要达到优化目前,等价于将协方差矩阵对角化:即除对角线外的其它元素化为0,并且在对角线上将元素按大小从上到下排列(因为协方差均为0,所以保证方差最大就好了),这样我们就达到了优化目的。这样说可能还不是很明晰,我们进一步看下原矩阵与基变换后矩阵协方差矩阵的关系:
设原始数据矩阵X对应的协方差矩阵为C,而P是一组基按行组成的矩阵,设Y=PX,则Y为X对P做基变换后的数据。设Y的协方差矩阵为D,我们推导一下D与C的关系:
现在事情很明白了!我们要找的P不是别的,而是能让原始协方差矩阵对角化的P。换句话说,优化目标变成了寻找一个矩阵P,满足 P C P T PCP^{T} PCPT是一个对角矩阵,并且对角元素按从大到小依次排列。如果我们想降到K维,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件。
现在所有焦点都聚焦在了协方差矩阵对角化问题上,矩阵对角化在线性代数领域已经属于被玩烂了的东西,所以这在数学上根本不是问题。
由上文知道,协方差矩阵C是一个是对称矩阵,在线性代数上,实对称矩阵有一系列非常好的性质:
1)实对称矩阵不同特征值对应的特征向量必然正交。
2)设特征向量λ重数为r,则必然存在r个线性无关的特征向量对应于λ,因此可以将这r个特征向量单位正交化。
由上面两条可知,一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量 e 1 e_{1} e1 e 2 e_{2} e2… e n e_{n} en ,设这n个特征向量为:
E = ( e 1 T , e 2 T … e n T ) E=\left( e_{1}^{T},e_{2}^{T}\ldots e_{n}^{T}\right) E=(e1T,e2T…enT)
则对协方差矩阵C有如下结论:
其中Λ为对角矩阵,其对角元素为各特征向量对应的特征值(可能有重复)。
到这里,我们发现我们已经找到了需要的矩阵P:
P是协方差矩阵的特征向量单位化后按行排列出的矩阵,其中每一行都是C的一个特征向量。如果设P按照Λ中特征值的从大到小(也就是按照P所对应的特征值从大到小),将特征向量从上到下排列。则用P的前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵res。
转载:https://blog.csdn.net/Stydwn/article/details/117092562