资讯动态

【老计带你懂线性代数】10:特征分解与PCA,用线代做降维

发布时间:2026/10/18 6:14:08 来源:尧图企业网站定制
【老计带你懂线性代数】10特征分解与PCA用线代做降维开头把降维讲到根上在《老计带你懂AI算法》和《老计带你懂概率统计》里我们都讲过PCA降维但都是从效果层面讲的找方差最大的方向、留住信息、扔掉冗余。这一篇我们从线性代数的根上把PCA彻底讲透你会看到它其实就是上一篇特征值特征向量的一次漂亮应用。读完这篇PCA对你就再无黑箱。你会明白它为什么能找到主方向、那些主成分到底是什么、为什么它用的是协方差矩阵的特征向量。这是三个系列在降维这个点上的一次彻底会师。特征分解把矩阵拆成它的本质方向先讲特征分解。上一篇我们找到了一个矩阵的特征值和特征向量特征分解就是把矩阵用它的特征向量和特征值重新表示出来。直觉上特征分解在说一个矩阵所做的复杂变换可以拆解成三步先转到特征向量的坐标系、在各个方向上按特征值纯缩放、再转回来。换句话说任何一个可分解的变换骨子里都是换个角度看就是几个方向上的简单拉伸。特征分解就是把这个本质显式地拆出来。打个比方一个复杂的舞步变换特征分解告诉你其实它等于先转个身面向几个特定方向、在每个方向上迈固定步长、再转回来。再花哨的动作拆开都是几个主方向上的简单移动。特征分解就是这套拆解说明书。特征分解的意义在于它让我们能从最本质的方向去理解和操作矩阵。而它最重要的应用之一就是PCA。PCA的第一步用协方差矩阵描述数据怎么散布现在讲PCA。要理解它先得有一个东西协方差矩阵它描述一堆数据是怎么散布的。回忆一下一堆数据点散在空间里形成某种形状比如一个拉长的椭圆。协方差矩阵就是用一个矩阵精确地刻画这堆数据在各个方向上散得开不开、以及不同特征之间怎么一起变化比如身高和体重是不是一起增长。它抓住了数据分布的形状。关键点来了这个协方差矩阵是对称的上一篇末尾专门铺垫过所以它的特征向量互相垂直、特征值都是实数天然适合当一组新坐标轴。PCA的核心主成分就是协方差矩阵的特征向量这是全篇的核心一句话说透对数据的协方差矩阵做特征分解得到的特征向量就是主成分数据的主方向对应的特征值就是数据在那个方向上的方差散布程度、信息量。把这句话拆开体会上一篇说过特征值最大的特征向量是变换拉伸最狠的方向。放到协方差矩阵上特征值最大的特征向量就是数据方差最大、散得最开、信息最多的方向这正是第一主成分。第二大特征值对应的特征向量是与第一主成分垂直的、次要的方向就是第二主成分。以此类推。降维就是只保留特征值最大的前几个特征向量主成分把数据投影到它们张成的低维空间上。大特征值方向信息多、留下小特征值方向信息少、舍弃。所以PCA的全流程用线代语言说就是算协方差矩阵、对它做特征分解、按特征值从大到小排特征向量、取前k个作为新坐标轴、把数据投影上去。前两个系列讲的找方差最大的方向、留住信息在这里落到了实处方差最大的方向就是协方差矩阵最大特征值对应的特征向量。降维这件事被特征值特征向量从根上解释清楚了。打个比方PCA像给一群站成椭圆形的人重新安排坐标。它先看清人群散布的形状协方差矩阵找出人群拉得最开的那条主轴最大特征向量和次轴然后说与其用东南西北记录每个人不如就用沿主轴的位置来记录因为人群主要就是沿这条轴散开的。只记主轴位置就用一个数概括了每个人的大致位置这就是降到一维。为什么留方差大的方向是保留信息有个问题值得停下来想清楚PCA为什么留方差大的方向、扔方差小的方向就等于保留了信息、丢掉的是无关紧要的关键在于方差大意味着数据在这个方向上散得开、不同样本区分得明显方差小意味着大家在这个方向上都差不多、挤成一团。一个方向如果所有样本取值都几乎一样方差接近0那它对区分样本毫无帮助扔掉它几乎不损失任何区分能力。反过来方向上散得越开越能把不同样本拉开距离这个方向就越有信息价值。打个比方你要用尽量少的信息描述一个班的学生。如果全班身高差不多方差小、但成绩差异巨大方差大那描述成绩远比描述身高有用因为成绩能把学生区分开身高几乎区分不了。PCA就是自动挑出那些最能把样本区分开的方向方差大的扔掉那些大家都雷同、区分不了的方向方差小的。这就是为什么保留大方差方向等于保留信息这也和《老计带你懂概率统计》里讲方差衡量数据分散程度完全一脉相承。理解了这层你就懂了PCA取舍的判断标准到底在判断什么。输入和输出长什么样输入一份数据矩阵样本乘特征通常先做中心化每个特征减去均值。输出主成分几个特征向量即新坐标轴方向、每个主成分的方差占比特征值占比表示留住了多少信息、以及降维后的数据。NumPy可以手写全流程sklearn有现成的PCA。上代码手写一遍PCA# 依赖pip install numpy scikit-learnimportnumpyasnpfromsklearn.datasetsimportload_iris# 加载鸢尾花数据:150朵花,每朵4个特征(4维)X,yload_iris(return_X_yTrue)print(原始数据形状:,X.shape)# (150, 4)# 第1步:中心化,每个特征减去它的均值X_centeredX-X.mean(axis0)# 第2步:算协方差矩阵(描述数据怎么散布,是对称矩阵)covnp.cov(X_centered,rowvarFalse)# 4x4的协方差矩阵print(协方差矩阵形状:,cov.shape)# 第3步:对协方差矩阵做特征分解eigenvalues,eigenvectorsnp.linalg.eigh(cov)# eigh用于对称矩阵# 第4步:按特征值从大到小排序(特征值大方差大信息多)idxnp.argsort(eigenvalues)[::-1]eigenvalueseigenvalues[idx]eigenvectorseigenvectors[:,idx]print(\n特征值(每个主成分的方差,从大到小):,np.round(eigenvalues,3))ratioeigenvalues/eigenvalues.sum()print(各主成分信息占比:,np.round(ratio,3))print(前2个主成分累计留住信息:,round(ratio[:2].sum(),3))# 第5步:取前2个主成分(特征向量),把4维数据投影降到2维top2eigenvectors[:,:2]X_pcaX_centered top2print(\n降维后形状:,X_pca.shape,(从4维压到2维))print(前3个样本降维后:\n,np.round(X_pca[:3],3))# 对比:用sklearn的PCA,结果应一致(验证我们手写的对)fromsklearn.decompositionimportPCA X_sklearnPCA(n_components2).fit_transform(X_centered)print(\nsklearn的PCA前3个样本:\n,np.round(X_sklearn[:3],3))print(和我们手写的一致(可能正负号相反,不影响,方向而已))运行输出示例原始数据形状: (150, 4) 协方差矩阵形状: (4, 4) 特征值(每个主成分的方差,从大到小): [4.228 0.243 0.078 0.024] 各主成分信息占比: [0.925 0.053 0.017 0.005] 前2个主成分累计留住信息: 0.978 降维后形状: (150, 2) (从4维压到2维) 前3个样本降维后: [[-2.684 0.319] [-2.714 -0.177] [-2.889 -0.145]] sklearn的PCA前3个样本: [[-2.684 0.319] [-2.714 -0.177] [-2.889 -0.145]] 和我们手写的一致(可能正负号相反,不影响,方向而已)运行你会看到4维鸢尾花数据算出4乘4的协方差矩阵特征分解后第一个特征值4.228占了92.5%的信息前两个主成分累计留住97.8%的信息于是把4维压到2维几乎不丢东西我们手写的PCA结果和sklearn完全一致。整个流程就是上一篇特征分解的直接应用协方差矩阵的特征向量就是主成分这就是PCA的线代真身。在AI里怎么用降维与可视化把高维数据压到2到3维画出来看或降维后再喂给模型提速防过拟合呼应《老计带你懂AI算法》PCA篇。去噪与压缩舍弃小特征值方向往往是噪声保留主成分起到去噪和压缩作用。人脸识别的特征脸早期人脸识别把人脸做PCA得到的主成分叫特征脸是经典应用。这里把特征脸多讲一句因为它特别能体现PCA的威力和美感。一张人脸照片有成千上万个像素高维向量但把大量人脸做PCA后会发现用几十到上百个主成分特征脸就能相当好地重建出任意一张人脸。每个主成分本身是一张模糊的、抽象的脸型模板有的主成分反映胖瘦、有的反映光照、有的反映五官间距任意一张真实人脸都约等于这些模板脸按不同比例的加权组合。于是识别一个人不用比对几万个像素只用比对这几十个组合系数就行又快又准。这就是降维的实际价值把一张脸从几万维压缩成几十维抓住了脸的本质、扔掉了冗余还顺带去了噪。虽然如今人脸识别早已被深度学习取代但特征脸这个思路把抽象的PCA变成了看得见摸得着的东西至今是理解降维的经典范例。数据预处理很多流程先PCA降维去相关再做后续建模。常见误区PCA前要先中心化减均值否则算出的方向会被数据的整体位置带偏。主成分是新的组合特征、没有直观现实含义第一主成分可能是0.5身高加0.3体重加…这是降维换来的代价呼应算法系列讲的。特征值占比决定留几维看累计信息占比比如留住95%来决定保留几个主成分。PCA只抓线性结构数据是复杂非线性时PCA力不从心要用非线性降维如t-SNE这也和算法系列呼应。小结与承上启下特征分解把矩阵拆成它的特征向量和特征值本质是换个角度看就是几个方向上的纯缩放。协方差矩阵描述数据怎么散布是对称矩阵特征向量正交、特征值实数。PCA的线代真身主成分就是协方差矩阵的特征向量特征值就是那个方向的方差信息量降维就是留大特征值方向、投影上去。打通三系列前面讲的找方差最大方向、留住信息根子就是协方差矩阵的特征分解。特征分解很强但它只对方阵有效。现实里大量矩阵不是方阵比如用户乘物品的评分表。有没有一个更通用、任何矩阵都能拆的分解有它是线性代数皇冠上的明珠。下一篇讲SVD奇异值分解看它怎么拆解任意矩阵以及它在推荐、压缩、降维里的巨大威力。我们下一篇见。延伸阅读3Blue1Brown《线性代数的本质》特征分解与基变换https://www.3blue1brown.com/topics/linear-algebrascikit-learn 官方文档PCAhttps://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.htmlNumPy 官方文档对称矩阵特征分解np.linalg.eighhttps://numpy.org/doc/stable/reference/generated/numpy.linalg.eigh.html说明以上为官方与经典公开资料地址可能随版本调整如打不开可用标题搜索。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑