PCA用于信息压缩,那么什么是信息呢?决策树中,用熵代表信息,而在PCA中,用方差来衡量信息。
从高纬度的信息中提取主要信息,以此达到压缩信息【降维】的目的,就是PCA要干的事儿~
1.1 数学基础
在降维中,PCA使用的信息衡量指标就是样本方差,又称可解释性方差,方差越大,特征所带的信息越多,让数据能够压缩到少数特征上并且总信息量不损失太多的技术就是矩阵分解,PCA找到的每个新特征向量就叫做“主成分”,而被丢弃的特征向量很有可能就是噪音
那么PCA的原理是什么呢?首先来简单普及需要用到的数学基础
1.1.1 内积
向量的内积:内积的几何意义是用来表示或计算两个向量之间的夹角,以及在A向量在B向量方向上的投影
举个栗子,如下图所示,A,B是如图在二维空间的向量,|A|cos(a)可以看成A在B向量上的投影(蓝线);d(A,B)代表AB之间的距离(虚线)
对于内积,总结一下就以下四条公式:
说人话就是,1. 向量A和向量B的点积为常数C;2. 向量A的长度等于根号下A的转置与A的点积;3. 用向量A和向量B的点积和长度可以求的他们的夹角值;向量A和向量B的距离计算公式
1.1.2 基
基可以理解为坐标系,平时我们使用的最多的坐标系就是(0,1)和(1,0)坐标系【即横纵的x轴和y轴】
向量在不同基下的坐标怎么求呢?其实很简单,向量的坐标就是其在基上的投影。那怎么求这个投影呢?上文提到的内积可以帮我们解决这个问题。通过将向量和对应基向量做内积,则可以求出对应向量在新基下的值【其实就是一个向量乘另一个向量,只不过现在有一个向量是基向量】
因此,同一个向量在不同基下的投影是不一样的【坐标不一样】,我们要想准确的描述向量,必须要先确定基
PCA的思路在于,将原始数据转换到新的低纬度的基,从而达到降维的目的
假设pi是基向量,i表示第i个基;xj表示第j个原始数据
结果表示的意义是指将原始数据投影到新的基中,当基的维度减少时,Xj在新的基中的维度也减少,即可以达到降维的效果
但是要降低到多少维度才能保住效果比较好呢?目前的做法是,投影后的投影值要尽可能的分散,因为越分散,样本的熵越大,熵越大包含的信息越多,因此我们还需要用方差和协方差来衡量分散程度
1.1.3 方差和协方差
- 方差
a表示样本i的值,µ表示均值,衡量样本的波动,方差越大样本越分散,则包含的信息越多,因此优化问题变成使得所有数据变换为这个基上的坐标表示后,方差值最大
- 协方差
协方差用于衡量两个随机变量的联合相关程度,当两个变量的Cov为0时,则完全独立。为了消除共线性,我们需要让变量彼此间尽可能线性不相关,因此我们选择基的时候,需要使用正交基,让投影数据经过这组正交基转化后两两之间协方差为0,并且方差尽可能大
1.1.4 特征值和特征向量
这部分需要一点点线性代数基础,当然,如果没有的话就记住公式就好~
先来看看定义:给定一个n阶矩阵A,若这个矩阵和n维非0列向量X以及常数λ满足AX = λX,那么λ就称为A的特征值,X称为A对应于特征值λ的特征向量
如何理解AX = λX 这个公式呢?
先来举个栗子,结合栗子来理解公式会更容易理解
给定矩阵A,还有三个方向向量X1,X2,X3,通过求矩阵与这三个向量相乘得到AX1,AX2,AX3,我们在二维坐标系中绘制出这6个向量,如图所示
首先看等式左边部分,AXi代表一个矩阵A和一个向量X的乘积,从图中我们可以发现,原n阶矩阵乘以不同的向量Xi后都发生了变化。对于向量X3来说,AX3在原方向上发生了伸缩变化;而对于X1和X2来说,乘以矩阵A后大小和方向都发生了变化。因此,矩阵和向量乘积的意义在于对该向量做了伸缩或者旋转变化。
再看等式右边的部分,一个实数和向量相乘,根据上方AX3 = 3X3的推导过程我们知道,其实等式右边部分是对向量X做了伸缩变化
因此,这个公式就是特征向量与矩阵A相乘后没有发生旋转变化,只发生了伸缩变化,并且伸缩了λ【特征值】倍
为啥要讲这个呢?因为使用PCA时,我们需要构造降维矩阵,而构造降维矩阵的过程需要使用到特征值和特征向量
1.2 PCA推导
1.2.1 PCA理论推导
【⚠️公式警告】前方有数学推导,如果不想看推导过程的话,记住结论即可
其实PCA的原理完全就是特征值和特征向量,回顾公式AX = λX,在PCA算法下,我们换个字母表示,Av = λv,此时X代表我们的原始数据,A代表有原始数据X组成的协方差矩阵,v代表的是特征向量【用于降维的基向量】,λ是特征值,代表的是方差【信息量的大小】
因此我们只要找出在在最大的k个特征值λ下的特征向量,组合成我们新的基矩阵【降维矩阵】,然后再求将原始数据投影到新的基中即可完成降维
说人话就是,我们要降到k维,必须要找到新的k维的基,在这个基中,原始数据能保留最多的信息,因此只要找出最大的k个λ对应的特征向量组成的基便是我们新的基【λ越大信息越大】
【以下是推导过程,可以跳过】
1. 中心化
主成分分析第一步必须要进行中心化,即让数据的均值变为0,主要也就是用以下两个公式
也就是先求出变量均值,然后所有的变量都偏移对应均值个单位
2. 构造协方差矩阵
假设v为任意方向,模长为1的单位向量,如果要将中心化后的X投影到v向量方向上的话,要如何计算v方向上的方差呢?
套用上文提到的方差公式,可以得到以下式子
一眼望去好复杂,其实不难,1/(n-1)代表无偏估计;平方项内的xi*v代表x在v方向上的投影;最后一项就是x在v方向上投影的均值。
还记得一开始进行了中心化吗?中心化后均值变为0,均值为0,那投影后的均值肯定也为0,所以后面这一项可以直接忽略
稍微解释一下,中间项是协方差矩阵,我们用A表示,特征向量v的长度为1
3. 求解
现在有了两个约束,1是方差,2是特征向量长度,我们用拉格朗日乘子法构造关于这两个约束的函数
最后我们得到了Av = λv, 这不就是特征值和特征向量的公式嘛
λ就是特征值,也代表了方差,而v就是对于λ下的特征向量,也就是我们要找的基
而λ有多个,特征向量也有多个,要咋办呢?还记得一开始提到的,方差代表了信息吗?为了保存尽可能多的信息,我们要选择尽可能大的λ,因此我们要降到k维时,就要选择前k个λ,然后用其对应的特征向量构造变换矩阵来降维
1.2.2 栗子
来一个栗子,直观感受一下实现过程
给定原始数据矩阵X,先进行中心化处理,上式X以及完成了中心化处理
稍微提一下,这里的X矩阵每一行代表一个维度【一个变量】,每一列代表一个样本值
- 计算协方差矩阵
- 计算特征值λ
- 构造特征向量
根据特征值,计算出对应的特征向量v1和v2
- 构造变换矩阵并降维
这里需要注意两点
- 这里的特征值必须按照从大到小排列,因为我们需要优先挑选方差大的基,因此优先选择λ大的值
- 构造特征矩阵时,每一行时一个特征向量,因为我们的原始数据矩阵每一行是一个维度
因为原始数据是2维,降维的话只能降到1维,所以选择第一个特征向量【λ最大的特征向量】,将降维后的主成分矩阵用Y表示
1.3 PCA的python实现
1. 主成分个数的选取原则
- 单个主成分解释的变异不应该小于1【方差大于1】,比如选取3个主成分,第3个主成分解释的方差相当于一个原始变量的变异
- 选取主成分累计的解释变异达到80%-90%,以此来选择主成分个数
2. 主成分分析三种运用场景
- 综合打分:只求出一个综合打分,相对于单项成绩简单加总来讲,主成分分析会赋予区分度高的单项成绩以更高的权重,
分值更合理,不过当主成分分析不支持取一个主成分时,就不能使用该方法了
对数据进行描述,描述产品情况【波士顿矩阵】子公司业务发展状况,区域投资潜力等,需要将多变量压缩到少数几个主成分进行描述,如果压缩到两个主成分是最理想的。这类分析一般还要涉及到因子分析
为聚类或回归分析提供变量压缩
3. python下的PCA实现
from sklearn.decomposition import PCA
from sklearn import preprocessing
corr_matrix = data.corr(method='pearson') # 查看相关系数矩阵
data = preprocessing.scale(data) # 使用pca前必须先进行标准化【此处使用中心标准化】
pca = PCA(n_components=5)
pca.fit(data)
print(pca.explained_variance_) # 打印可解释方差,选取大于1的特征
print(pca.explained_variance_ratio_) # 打印可解释方差占比,根据80%-90%原则,选取n_compnents参数
data.frame(pca.components_).T. # 查看主成分各权重
PCA的代码实现不难,重点掌握其基本原理,相关运用场景以及主成分个数的选取原则即可~
【相关参考】
[1]https://blog.chemcyber.com/2019/03/10/%EF%BB%BF%E7%89%B9%E5%BE%81%E5%80%BC%E5%92%8C%E7%89%B9%E5%BE%81%E5%90%91%E9%87%8F%E6%84%8F%E4%B9%89/
[2]https://blog.csdn.net/dugudaibo/article/details/78931825
[3]https://www.bilibili.com/video/BV1JD4y1D7zq?t=975