PCA (principal component analysis)算法
一、 PCA算法
PCA(principal component analysis)是一种应用广泛的降维算法,其基本思想是想通过找到一个低维的“最具有代表性”的方向,并将原数据映射到这个低维空间中去,从而实现数据的降维。
1. 算法原理
我们先从二维数据简单说明,假设我们有n个二维数据组成的数据集
图1. 二维PCA降维示意图(由于技术限制,本图映射并没有遵循投影规则) |
我们首先先确定我们的优化目标,即什么情况下的映射能尽可能保留我们数据的信息,又或者说映射成的数据
1. redundancy (冗余)
假设在一个二维数据中,是否所有维度都应该保留?在图2中,我们对于几组不同的数据,很明显能看出,左侧图中
为此PCA的思想就是去除那些冗余的维度,让映射到的低维空间中,每个方向都具有低的相关性,从而使映射后的数据
图2. 来自两个单独的测量 , |
2. 协方差矩阵
由概率论的知识我们知道,协方差可以用来描述两个变量之间的相关性。
协方差的定义为:
协方差越大,两个变量的相关性越强;协方差等于0,两个变量没有相关性。
对于一个零均值化后数据矩阵
其中协方差矩阵对角线上的元素是每个变量自身的方差,其他元素是两个变量之间的协方差。协方差矩阵反应了数据的噪声与信号,其中对角代表着信号值,其余代表着噪声。我们不仅希望噪声越小,还希望信号越大,即我们希望保留数据方差最大所代表的方向。
对于式(1),我们可以求得:
3. 算法推导
由上述已知Y的协方差矩阵为一个对角矩阵,即为
即:
由线性代数的知识我们知道,上式是一个对称矩阵的合同变换,其中对角阵
综上我们得知,如果要将X映射到Y中,只需要选取最大特征值所对应的特征向量构成变换矩阵A,则可获得映射后的数据集Y。
4. 算法步骤
- 将数据集X零均值化
- 计算X的协方差矩阵,并进行特征值分解
- 选取k个最大的特征值所对应的特征向量,组成变换矩阵A
- 得到降维后的新数据Y=AX
2. 代码补充
补充的代码如下:
######### 需要你完成: ######### # 1. 计算数据的均值向量mu mu = np.mean(X,axis=0) X = X - mu # 2. 计算数据的协方差矩阵S S = np.cov(X.T) # 3. 对S进行特征值分解,求得其特征值L以及对应的特征向量U L,U = np.linalg.eig(S) L = np.real(L) # 4. 选取L中前k个最大的特征值所对应的特征向量构成降维矩阵W idx = np.argsort(L)[::-1] W = U[:, idx[:k]] ###############################
3. 实验效果
原始图片(图3)及降维后图片(图4)如下:
![]() |
---|
图3. 原始图像展示 |
![]() |
---|
图4. 保留不同数量的主成分后的降维图片 |
4. 参考文献
[1] J.Shlens "A Tutorial on Principal Component Analysis" arXiv preprint, arXiv:1404.1100v1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理