文章摘要
PCA降维就像从照片中提取关键特征:将每张照片视为高维空间中的点,通过去中心化、计算协方差矩阵,找到数据变化最大的方向(特征向量)。这些方向对应最长的椭球体轴(特征值越大越重要),选择前几个主成分投影即可实现降维。例如,用脸的宽度和眼睛大小区分不同人脸。代码实现包括数据居中、协方差计算、特征分解及投影。PCA本质是保留信息最丰富的低维特征,实现高效数据表征。
一、PCA降维的生活比喻
1. 比喻:看照片找“最有代表性”的方向
想象你有一堆人的照片(比如游戏角色的脸部表情),每张照片都可以看作一个高维的点(比如每个像素都是一个维度)。
你想用更少的特征来描述这些照片,比如只用2个数字就能大致区分不同的脸。
这就像你在一堆散乱的照片中,找出“最能区分大家”的方向——比如脸的宽度、眼睛的大小等。
这些“最有代表性”的方向,就是特征向量。
二、PCA降维的步骤(形象+简化版)
1. 数据准备
- 把每张照片摊平成一个长长的向量(比如100x100像素的照片就是1万个数字)。
- 把所有照片排成一个大表格,每一行是一张照片。
2. 去中心化
- 每一列(每个像素点)减去平均值,让数据“居中”,这样分析才不会被整体亮度等影响。
3. 计算协方差矩阵
- 协方差矩阵可以理解为“每两个像素之间的变化关系”。
- 这就像你在分析:如果左眼变亮,右眼是不是也会变亮?
4. 找特征向量和特征值
形象解释:
- 你把所有照片点在一个高维空间里,点云可能是斜着拉长的椭球体。
- 你想找出椭球体最长的轴,这就是“变化最大”的方向。
- 这些轴的方向,就是特征向量;轴的长度,就是特征值。
数学操作:
-
你要解协方差矩阵的特征方程:
C v ⃗ = λ v ⃗ C\vec{v} = \lambda \vec{v} Cv=λv
其中 (C) 是协方差矩阵, v ⃗ \vec{v} v 是特征向量, λ \lambda λ 是特征值。
-
这一步可以用数值算法(比如SVD分解、QR分解等)在计算机里自动完成。
5. 选取最大的几个特征值对应的特征向量
- 最大的特征值对应的特征向量,就是“最能区分照片”的方向。
- 你可以只保留前几个特征向量,把原始照片投影到这些方向上,就能用更少的数字描述照片。
三、形象小故事
假如你是个画家,要画一群人的素描。你发现:
- 只要画出脸的宽度和眼睛的大小,大家就能认出来是谁了。
- 这两个“最有代表性”的特征,就是你通过PCA找到的特征向量。
四、代码小例子(伪代码)
import numpy as np
# 假设data是N张照片,每张照片摊平成M维向量
data = ... # N x M
# 1. 去中心化
mean = np.mean(data, axis=0)
data_centered = data - mean
# 2. 计算协方差矩阵
cov = np.cov(data_centered, rowvar=False)
# 3. 求特征值和特征向量
eigvals, eigvecs = np.linalg.eigh(cov)
# 4. 选取最大的几个特征向量
idx = np.argsort(eigvals)[::-1]
principal_components = eigvecs[:, idx[:2]] # 取前2个主成分
# 5. 投影到主成分上
reduced_data = np.dot(data_centered, principal_components)
五、总结口诀
- 特征向量:数据变化最“有代表性”的方向。
- PCA降维:就是找这些方向,把数据投影过去,信息损失最小。
进一步对一些概念深入讲解
1. 为什么“点云可能是斜着拉长的椭球体”?
- 每张照片摊平成一个向量后,可以看作是高维空间里的一个点。
- 所有照片组成的点云,分布在高维空间里。
- 这些点的分布,往往不是正方体、圆球,而是某些方向上更分散、某些方向上更集中。
- 这种分布形状,数学上叫“椭球体”——就像橡皮泥团被拉长、压扁后形成的形状。
- “斜着”是因为数据的主方向不一定和坐标轴对齐,可能是任意方向。
2. 为什么要找“椭球体最长的轴”?
- 最长的轴表示数据在这个方向上变化最大、分布最广。
- 这说明这个方向最能区分不同的数据(比如不同的脸型、表情)。
- 如果你只用这一个方向的信息,能保留最多的原始信息。
3. 为什么“这些轴的方向,就是特征向量”?
- 协方差矩阵描述了数据在各个方向上的变化关系。
- 特征向量就是协方差矩阵作用下,数据“变化最纯粹”的方向。
- 这些方向,正好就是椭球体的主轴方向。
- 换句话说,特征向量告诉你:数据在哪些方向上最分散。
4. 为什么“轴的长度,就是特征值”?
- 特征值表示数据在对应特征向量方向上的“方差”有多大,也就是分布有多广。
- 椭球体的主轴越长,说明数据在这个方向上变化越大,特征值也就越大。
- 所以,特征值=主轴长度的平方(严格来说是方差,和长度有关)。
5. 形象总结
- 想象你把一堆照片点在空间里,形成一个“橡皮泥团”。
- 你用手捏住橡皮泥团的中心,发现它有一根最长的轴(主轴),这就是数据变化最大的方向。
- 这根轴的方向,就是特征向量;这根轴的长度,就是特征值。
- 你如果只保留这根轴的信息,就能最大程度地保留原始数据的差异。
6. 直观小图(脑补)
^ y
|
| . .
| . .
| . .
| . .
+-----------------> x
- 点云斜着拉长,最长的方向就是主轴(特征向量),长度就是特征值。
7. 总结
- 数据分布像椭球体,是因为各方向变化不一样。
- 椭球体最长的轴,表示变化最大、信息最多的方向。
- 这些轴的方向就是特征向量,长度就是特征值。
继续探讨一些问题
一、为什么PCA能找到这些轴?
1. PCA的目标是什么?
PCA(主成分分析)的目标是:
找到数据中“变化最大”的方向,也就是数据分布最“分散”的方向。
这样我们可以用最少的维度,保留最多的信息。
2. 数学原理
- 数据的“分散程度”用方差来衡量。
- PCA就是要找一个方向(向量),让所有数据点投影到这个方向上的方差最大。
- 这个方向,正是协方差矩阵的最大特征值对应的特征向量。
证明思路(简化版):
- 假设你找一个单位向量 w ⃗ \vec{w} w,让数据 ( X ) 投影到 w ⃗ \vec{w} w 上的方差最大。
- 投影后的方差 = w ⃗ T C w ⃗ \vec{w}^T C \vec{w} wTCw(( C ) 是协方差矩阵)。
- 约束 w ⃗ \vec{w} w 是单位向量(长度为1)。
- 这个优化问题的解,就是协方差矩阵的最大特征值对应的特征向量。
3. 直观理解
- 协方差矩阵“编码”了数据在各个方向上的变化关系。
- 它的特征向量,就是数据分布的“主轴”方向。
- 特征值越大,说明数据在这个方向上越分散。
二、二维/三维的具体例子
1. 二维例子
假设你有一堆二维点(比如身高和体重):
^
y | .
| .
| .
| .
| .
+----------------->
x
- 这些点大致沿着一条斜线分布。
- 你想找一条直线,让所有点投影到这条线上后,分布得最开。
- 这条直线的方向,就是第一主成分(最大特征向量)。
- 这条线的“长度”反映了数据在这个方向上的方差(特征值)。
直观动画(脑补):
- 你用一根棍子去“穿过”点云,让棍子能覆盖最多的点,这根棍子的方向就是主轴。
2. 三维例子
假设你有一堆三维点(比如RGB颜色分布):
- 点云可能像一个“椭球土豆”。
- 你想找一根最长的轴(主轴),再找第二长的轴(和第一根正交),再找第三根轴。
- 这三根轴就是协方差矩阵的三个特征向量,分别对应最大、次大、最小的特征值。
直观动画(脑补):
- 你用三根互相垂直的棍子去“穿过”点云,最长的那根就是第一主成分,第二长的是第二主成分,第三根最短。
三、PCA降维的实际操作
- 你可以只保留前两个主成分(特征向量),把高维数据投影到这两个方向上。
- 这样就能用二维图像展示原本高维的数据分布,信息损失最小。
四、可视化小例子(Python代码)
import numpy as np
import matplotlib.pyplot as plt
# 生成二维点云
np.random.seed(0)
X = np.dot(np.random.randn(2, 200), np.array([[2, 1], [1, 0.5]])) + np.array([[5], [10]])
# 计算协方差矩阵
X_centered = X - X.mean(axis=1, keepdims=True)
cov = np.cov(X_centered)
# 求特征值和特征向量
eigvals, eigvecs = np.linalg.eigh(cov)
# 画图
plt.scatter(X[0], X[1], alpha=0.3)
origin = X.mean(axis=1)
for i in [1, 0]: # 最大特征值在后面
vec = eigvecs[:, i]
plt.plot([origin[0], origin[0] + vec[0]*eigvals[i]],
[origin[1], origin[1] + vec[1]*eigvals[i]],
linewidth=3, label=f'PC{i+1}')
plt.legend()
plt.axis('equal')
plt.show()
- 图中最长的那根线,就是PCA找到的“主轴”方向(最大特征向量)。
五、总结
- PCA能找到这些轴,是因为它本质上在找数据分布最“分散”的方向,这正是协方差矩阵的特征向量。
- 二维/三维例子可以直观地看到,PCA找到的主轴就是点云分布最长的方向。