主成成分分析 PCA

概念

PCA(Principal components analysis)是一种分析和简化数据的技术,常用于减少数据集的维度,同时保持数据集中对方差贡献最大的特征,用数据里最主要的方面来代替原始数据,在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.

其方法主要是通过对协方差矩阵进行特征分解,以得到数据的特征值(即特征向量)和它们的权值(即特征值).

具体内容

基变换

欲获得原始数据新的表示空间,最简单的是对原始数据进行线性变换(基变换):$Y= PX$ ,其中 Y是样本在新空间中的表达,P 是基向量,X 是原始样本,当基的数量少于原始样本本身的维数则可达到降维的效果.

两个矩阵相乘的意义是将右边矩阵的每一列列向量变换到左边矩阵的每一行行向量所表示的空间中去.

方差

基于前面PCA最大可分思想,我们要找的方向是降维后损失最小,可以理解为投影后的数据尽可能的分开,那么这种分散程度可以用数学上的方差来表示,方差越大数据越分散.

也就是说寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大.

协方差

从二维到一维可以使用方差最大来选出能使基变换后数据分散最大的方向(基),但如果遇到高维的变换,则必须用到协方差了.

协方差:$Cov(a,b) = \frac{1}{m}\sum_{i=1}^{m}a_ib_i​$

协方差矩阵

假如只有 a 、 b 两个字段,那么我们将它们按行组成矩阵 X ,表示如下:

然后用 X 乘以 X 的转置再乘上$\frac{1}{m}$:

协方差矩阵是一个对称的矩阵,而且对角线是各个维度的方差,而其它元素是 a和 b的协方差,然后会发现两者被统一到了一个矩阵的。

协方差矩阵的对角化

为了使$\frac{1}{m}\sum_{i=1}^{m}a_ib_i = 0$,即使得协方差矩阵对角化

所以只要对协方差矩阵进行特征分解,求得特征值和特征向量,将特征值从大到小排列,再保留最上面的 N 个特征向量,将数据转换到上述N个特征向量构建的新空间中.

算法流程

输入:n维样本集$X= {x_1, x_2, x_3, … , x_m}$

输出:降维后的样本集 Y

  1. 对所有样本进行中心化:$x_i=x_i-\frac{1}{m}\sum_{j=1}^{m}x_j$
  2. 计算协方差矩阵:$C=\frac{1}{m}XX^\mathsf{T}$
  3. 求出协方差矩阵的特征值及对应的特征向量
  4. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
  5. Y=PX即为降维到k维后的数据

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def pca(dataMat, topNfeat = 9999999):
# 1. 去均值
meanVals = np.mean(dataMat, axis=0)
meanRemoved = dataMat - meanVals
# 2.计算协方差矩阵
covMat = np.cov(meanRemoved)
# 3.计算协方差矩阵的特征值和特征向量
eigVals, eigVects = np.linalg.eig(np.mat(covMat))
# 4.将特征值从大到小排序 保留最上面的N个特征向量
eigValInd = np.argsort(eigVals)
eigValInd = eigValInd[ : -topNfeat : -1]
redEigVects = eigVects[:, eigValInd]
# 5.将数据转换到上述N个特征向量构建的新空间中
lowDDataMat = meanRemoved * redEigVects
reconMat = (lowDDataMat * redEigVects.T) + meanVals

return lowDDataMat, reconMat

总结

PCA算法的主要优点:降低数据的复杂性,识别最重要的多个特征

PCA 算法的主要缺点:不一定需要,且可能损失有用信息

适用的数据类型:数值型数据

-------------本文结束 感谢您的阅读-------------