算法之主成分分析PCA详解(包含理论推导和代码)

1、PCA介绍

主成分分析算法(Principal Component Analysis)简称PCA,是一种常用的统计方法。该方法对高维的数据进行筛选,选出最具有代表性最重要的的几维数据,是一种有效的降维方法。

为什么要用PCA?

在m维数据中,当m非常大的时候,往往会存在较多相关性比较强的数据,从而影响算法的性能和准确率,因此,学者就开始研究,在保证数据的信息量尽量不变或很少改变的情况下,较大幅度的降低数据的维度呢?那么PCA就出来了。

2、PCA的理论推导

PCA是一种数据降维的算法,假设有m维数据,每个数据的维度是k维([kx1]的列向量),m是一个超大值,需要对其进行降维,降到n维,m维数据如下(每一列是一条数据):
在这里插入图片描述
为了将X从[kxm] 降维到[kxn],假设存在一个投影矩阵W,将X映射到[kxn]得到Z,公式如下
在这里插入图片描述
为了保证投影前后单条数据的信息不会发生变化,所以,这里的W矩阵应该是一个标准正交基矩阵,否则,会出现总信息量的变化,所以,W矩阵的表示形式如下:
在这里插入图片描述
其中:
在这里插入图片描述
由于W是一个标准正交基矩阵,那么存在如下的约束:
在这里插入图片描述
写成矩阵形式如下:
在这里插入图片描述
设投影后的数据矩阵为Z,公式如下:
在这里插入图片描述
完成数据降维后,假设将Z还原到mxk维后,数据的损失量尽可能的小,如何映射回mxk维?不难想到WxZ即可映射到与原来数据维度相同的数据,得出下面的公式:
在这里插入图片描述

有了原数据和映射还原后的数据,我们就可以做出假设,两个数据之间尽可能的相同,所以要满足:
在这里插入图片描述
而F范数公式如下:
在这里插入图片描述

上面的公式跟F范数一致,所以目标函数可以写成F范数的平方,并且W是一个标准正交基矩阵,所以可以写成如下的优化问题:
在这里插入图片描述
在这里插入图片描述

3、PCA模型求解

PCA的优化目标函数是一个凸函数,并且约束是一个等式约束,因此,可以断定该优化问题存在解析解,那么接下来开始凸优化求解析解的推导过程。
首先,介绍一下F范数的一个性质:
在这里插入图片描述
因此,目标函数可以优化成:

在这里插入图片描述
由于约束条件是一个等式约束,可以通过拉格朗日乘子法进行处理,如下:
在这里插入图片描述
在对W求导之前,先给出矩阵迹求导的相关定理
在这里插入图片描述
目标函数对W进行求导并化简:
在这里插入图片描述

由于目标函数是一个凸函数,因此,最大值肯定在导数=0的位置,因此令导数等于0进行化简:
在这里插入图片描述
通过上面的公式,可以发现跟矩阵特征值特征向量公式一样,因此,W可以看成XXT的特征向量组成的矩阵,而λ则是XXT的特征值,因此,W可以通过XXT的特征值分解的方法进行求解。

4、python实现代码

首先介绍一下PCA算法的主要流程:

1、对数据矩阵X进行去中心化.
2、计算矩阵X的协方差矩阵XXT
3、计算协方差矩阵的特征值和特征向量
4、选取前n个最大的特征值对应的特征向量构成W
5、利用X与W相乘,实现数据的降维
import numpy as np
from numpy.linalg import eig

def pca(X, n):
	X = X - X.mean(axis=0)
	covX = np.cov(X.T, ddof=0)
	eigVal, eigVectors = eig(covX)
	n_large_indexs = eigVal.argsort()[-n:][::-1]
	W = eigVectors[n_large_indexs]
	return np.dot(X, W.T)

if __name__ == '__main__':
	# test example: 4x3 映射成 4x2  
    X = np.array([[1,  2,  3],
                  [4,  5,  6],
                  [55, 88, 7],
                  [22, 44, 11]]);
    X_pca = pca(X, 2)
    print(X_pca)

输出结果:

[[ 33.66073984  18.2056667 ]
 [ 28.49016813  18.56869237]
 [-52.99155317 -34.25229705]
 [ -9.1593548   -2.52206202]]
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值