12·数学基础进阶

特征值与特征向量

mathlinear-algebra

第12课:特征值与特征向量

学习目标

  1. 理解特征值与特征向量的几何意义,即矩阵变换中的“不变方向”与“伸缩因子”。
  2. 掌握计算给定矩阵的特征值和特征向量的基本步骤(包括理论计算思路与Python实现)。
  3. 学会使用NumPy库快速求解特征值和特征向量。
  4. 理解特征值与特征向量在机器学习中的核心应用,如主成分分析(PCA)降维的基本思想。

核心概念

想象一下,你有一个矩阵A,它代表一种空间变换(例如旋转、拉伸)。当我们把这个矩阵乘以一个向量v时,通常v的方向和长度都会改变。

但是,存在一些特殊的向量,它们在被矩阵A变换后,方向保持不变(或正好反向),仅仅被拉伸或压缩了。这些特殊的向量就叫做特征向量(Eigenvector)

  • 特征向量:对于矩阵A,如果存在一个非零向量v和一个标量λ,使得 A * v = λ * v 成立,那么v就是A的一个特征向量,λ就是这个特征向量对应的特征值(Eigenvalue)
  • 特征值:就是特征向量在变换中的“伸缩因子”。λ > 1 表示拉伸,0 < λ < 1 表示压缩,λ < 0 表示方向反向且伸缩。

简单来说,特征向量指明了矩阵变换中“最稳定”的方向,而特征值描述了在这个方向上变换的强度

代码示例

1. 基本计算与验证

import numpy as np

# 定义一个2x2矩阵
A = np.array([[4, 2],
              [1, 3]])

# 使用numpy的线性代模模块计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)

print("矩阵 A:")
print(A)
print("\n特征值:", eigenvalues)
print("\n特征向量 (每一列是一个特征向量):")
print(eigenvectors)

# 验证特征值和特征向量的关系: A * v = λ * v
print("\n验证特征值方程 A * v = λ * v:")
for i in range(len(eigenvalues)):
    lambda_val = eigenvalues[i]
    v = eigenvectors[:, i]  # 提取第i列(第i个特征向量)
    Av = A @ v              # 计算 A * v
    lambda_v = lambda_val * v # 计算 λ * v
    
    print(f"\n对于特征值 λ = {lambda_val:.2f} 和对应的特征向量 v = {v}:")
    print(f"  A * v = {Av}")
    print(f"  λ * v = {lambda_v}")
    # 判断两者是否近似相等 (由于浮点数误差,使用np.allclose)
    print(f"  验证通过? {np.allclose(Av, lambda_v)}")

输出可能为:

矩阵 A:
[[4 2]
 [1 3]]

特征值: [5. 2.]

特征向量 (每一列是一个特征向量):
[[ 0.89442719 -0.70710678]
 [ 0.4472136   0.70710678]]

验证特征值方程 A * v = λ * v:

对于特征值 λ = 5.00 和对应的特征向量 v = [0.89442719 0.4472136 ]:
  A * v = [4.47213595 2.23606798]
  λ * v = [4.47213595 2.23606798]
  验证通过? True

对于特征值 λ = 2.00 和对应的特征向量 v = [-0.70710678  0.70710678]:
  A * v = [-1.41421356  1.41421356]
  λ * v = [-1.41421356  1.41421356]
  验证通过? True

2. 可视化理解(2D变换)

import matplotlib.pyplot as plt

# 创建图形
fig, ax = plt.subplots(1, 1, figsize=(8, 6))

# 设置坐标轴
ax.set_xlim(-3, 5)
ax.set_ylim(-3, 5)
ax.grid(True, alpha=0.3)
ax.axhline(y=0, color='k', linewidth=0.5)
ax.axvline(x=0, color='k', linewidth=0.5)

# 定义原点
origin = np.array([0, 0])

# 绘制原始特征向量 (变换前)
for i in range(2):
    v = eigenvectors[:, i]
    ax.quiver(*origin, *v, color=['blue', 'green'][i], scale=1, scale_units='xy', angles='xy', 
              label=f'特征向量 v{i+1} (λ={eigenvalues[i]:.1f})')

# 计算变换后的特征向量 (A * v)
for i in range(2):
    v = eigenvectors[:, i]
    Av = A @ v
    ax.quiver(*origin, *Av, color=['red', 'orange'][i], scale=1, scale_units='xy', angles='xy',
              label=f'A * v{i+1}')

ax.legend()
ax.set_title('矩阵变换下的特征向量:方向不变,仅长度改变')
plt.show()

运行这段代码,你会看到特征向量在矩阵A的变换下,确实只在原方向上被拉伸(蓝色/绿色箭头变长为红色/橙色箭头),而没有旋转。

3. 在机器学习中的应用简述:主成分分析 (PCA)

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import pandas as pd

# 加载经典的鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征矩阵 (150个样本,4个特征)

# 使用PCA将4维数据降至2维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 查看结果
print("原始数据维度:", X.shape)
print("降维后数据维度:", X_pca.shape)
print("\n每个主成分(新特征)的方差解释比:", pca.explained_variance_ratio_)

# 特征向量(主成分方向)存储在 pca.components_ 中
print("\n第一个主成分方向 (即第一个特征向量):")
print(pca.components_[0])

PCA的核心就是计算数据协方差矩阵的特征值和特征向量。最大的特征值对应的特征向量就是数据变化(方差)最大的方向,即“第一主成分”。

实践练习

练习1:基础计算

给定矩阵 B = [[2, 1], [1, 2]],请计算其特征值和特征向量,并验证其中一个特征向量满足 B * v = λ * v

练习2:理解与验证

对于矩阵 C = [[0, -1], [1, 0]](一个90度旋转矩阵),计算其特征值和特征向量。你发现特征值有什么特点?这反映了该矩阵的什么性质?(提示:思考旋转是否会让向量方向保持不变)。

练习3:应用思考(无需代码)

假设你有一个包含身高、体重、年龄三个特征的数据集。如果使用PCA进行降维,第一个主成分(最大的特征值对应的特征向量)很可能代表了什么综合信息?为什么特征值很重要?

常见错误

  1. 混淆左/右特征向量numpy.linalg.eig 返回的是右特征向量,即满足 A * v = λ * v。初学者有时会误以为返回的是行向量,实际上函数返回的矩阵中,每一列才是一个完整的特征向量。
  2. 忽略特征值和特征向量的复杂情况:对于非对称矩阵,特征值可能是复数,特征向量也可能是复向量。在初学时,可以多从对称矩阵(如协方差矩阵)入手,它们的特征值一定是实数。
  3. 误解特征向量的唯一性:一个特征值对应的特征向量不是唯一的,所有倍数(例如 2*v, -3*v)都是同一特征值对应的特征向量。np.linalg.eig 返回的通常是经过归一化(模为1)的向量。
  4. 认为所有矩阵都有特征向量:在实数域内,并非所有方阵都有实特征值(如练习2的旋转矩阵)。但在机器学习中,我们通常处理的是对称或半正定矩阵(如协方差矩阵),它们保证有良好的实数特征分解。

小结

  • 核心定义:矩阵A的特征向量v在变换中方向不变,仅伸缩λ倍(λ为特征值),公式为 A*v = λ*v
  • 几何意义:特征向量是变换中的“不变方向”,特征值是该方向上的“伸缩因子”。
  • 计算工具:使用 numpy.linalg.eig 可以方便地求出方阵的特征值和特征向量。返回的矩阵中,列向量为特征向量。
  • 关键应用:在机器学习中,特征值和特征向量是主成分分析(PCA)等降维技术的数学基石。大的特征值对应的特征向量指示了数据中最重要的变异方向。
  • 下一步预告:理解了特征值和特征向量这个强大的数学工具后,下一课我们将进入《概率论基础》,学习如何用概率来描述和建模不确定性,这是构建理解复杂机器学习模型的另一大支柱。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「概率论基础:事件、概率与条件概率」 以巩固所学知识。