PCA降维:一眼看懂数据的本质

文章摘要

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} w TCw (( 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找到的主轴就是点云分布最长的方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你一身傲骨怎能输

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值