目录
2.6 机器学习核心算法(PCA / SVM / 线性回归)
一、线性代数的作用
✅ 一句话回答:
线性代数是理解现代科技(AI、图像、数据、物理、工程)最基础的语言工具。
二、 线性代数到底“干了什么”?
2.1 你在学的神经网络:全是线性代数!
y = Wx + b
W:权重矩阵
x:输入向量
b:偏置向量
这就是矩阵乘法!
➡️ 所有前向传播、反向传播,通通是线性代数。
2.2 图像处理:图是矩阵,滤波是卷积乘法
一张图片是 H×W×C的张量
模糊、锐化、边缘检测,本质是线性代数里的 卷积核操作
图像压缩(比如 JPEG)背后是奇异值分解(SVD)
2.3 自然语言处理(NLP):词向量是高维向量
“苹果” 和 “香蕉” 都是 300 维向量
判断它们是否相似 → 向量点积、夹角 → 线性代数
2.4 搜索推荐系统:矩阵分解
用户-商品评分矩阵 → 用 SVD 分解 → 推荐新商品给用户
2.5 物理工程建模
电路、力学、弹性系统、图结构,都能用线性代数建模
大型工业仿真:用稀疏矩阵、线性方程组模拟
2.6 机器学习核心算法(PCA / SVM / 线性回归)
PCA(主成分分析):降维,用的是协方差矩阵的特征值分解
SVM 最大间隔超平面:点积、投影、线性变换
三、为什么要学它?
原因 | 解释 |
---|---|
📐 理解几何 | 向量、线性变换、投影、旋转、缩放 |
💡 打通 AI 底层原理 | 矩阵乘法、求导、梯度下降、SVD、PCA |
🧰 成为“算法工程师”必修技能 | 你不会线代,很多模型你只能调,不会造 |
💻 代码抽象 | 你写的 torch.mm(A, B) 背后就是线代的乘法规则 |
📊 数据处理 | 几乎所有数据都要用矩阵形式存储和处理 |
🧭 一个比喻:
如果数学是科学的语言,那线性代数就是工程和智能的语法。
不懂它,就像不会语法的人在看英文小说,全靠猜。
学习线性代数不是为了考试、也不是为了照搬公式,
而是让你能看懂数据、图像、模型背后的世界——它们其实都是线性的!
四、线性代数操作示例
4.1 执行代码
import torch
# ==============================
# 线性代数
# ==============================
print("\n" + "=" * 50)
print("线性代数操作示例")
print("=" * 50)
# 矩阵运算
A = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32)
B = torch.tensor([[5, 6], [7, 8]], dtype=torch.float32)
# 基本运算
print(f"矩阵加法:\n{A + B}")
print(f"元素乘法:\n{A * B}")
print(f"矩阵乘法:\n{torch.mm(A, B)}")
# 高级运算
print(f"\n行列式: {torch.det(A):.2f}")
print(f"逆矩阵:\n{torch.inverse(A)}")
# 使用新的特征值计算方法
eigenvalues = torch.linalg.eigvals(A)
print(f"特征值:\n{eigenvalues}")
# 解线性方程组
# AX = B → X = A^{-1}B
X = torch.mm(torch.inverse(A), B)
print(f"\n解线性方程组 AX=B:\n{X}")
# 奇异值分解
U, S, Vh = torch.linalg.svd(A)
print(f"\n奇异值分解:")
print(f"U:\n{U}\nS:\n{torch.diag(S)}\nVh (共轭转置):\n{Vh}")
# 矩阵范数
print(f"\nFrobenius范数: {torch.linalg.matrix_norm(A, ord='fro'):.2f}")
print(f"谱范数: {torch.linalg.matrix_norm(A, ord=2):.2f}")
4.2 运行结果
==================================================
线性代数操作示例
==================================================
矩阵加法:
tensor([[ 6., 8.],
[10., 12.]])
元素乘法:
tensor([[ 5., 12.],
[21., 32.]])
矩阵乘法:
tensor([[19., 22.],
[43., 50.]])
行列式: -2.00
逆矩阵:
tensor([[-2.0000, 1.0000],
[ 1.5000, -0.5000]])
特征值:
tensor([-0.3723+0.j, 5.3723+0.j])
解线性方程组 AX=B:
tensor([[-3., -4.],
[ 4., 5.]])
奇异值分解:
U:
tensor([[-0.4046, -0.9145],
[-0.9145, 0.4046]])
S:
tensor([[5.4650, 0.0000],
[0.0000, 0.3660]])
Vh (共轭转置):
tensor([[-0.5760, -0.8174],
[ 0.8174, -0.5760]])
Frobenius范数: 5.48
谱范数: 5.46
4.3 代码解析
初始矩阵
A = [[1, 2],
[3, 4]]
B = [[5, 6],
[7, 8]]
基本运算
1. 🔸 矩阵加法 A + B
2. 🔸 元素乘法 A * B
(不是矩阵乘法,是对应元素相乘)
3. 🔸 矩阵乘法 torch.mm(A, B)
高级运算
4. 🔸 行列式 torch.det(A)
5. 🔸 逆矩阵 torch.inverse(A)
▲第一步:
原A矩阵
▲第二步:二阶矩阵求逆公式
对一个二维矩阵
只要它的行列式不为 0,就可以求逆,公式如下:
代入 A 的值:
▲第三步:计算行列式
▲第四步:套用公式求逆
详细写法:
▲验证
A × A⁻¹ 应该是单位矩阵
使用新的特征值计算方法
6. 🔸 特征值 torch.linalg.eigvals(A)
PyTorch 使用数值方法求解:
手动求解:
化简得:
约为:
解线性方程组
7. 🔸 解线性方程组 AX = B
奇异值分解
总结(一句话记忆):
奇异值分解就是把一个矩阵拆成:先旋转 → 再拉伸 → 再旋转回来的过程。
📦 举个例子直观对比:
内容 | 说明 |
---|---|
![]() |
原始矩阵 |
![]() |
把单位向量“旋转”成 A 的主方向 |
![]() |
A 在两个主方向上的“拉伸强度” |
![]() |
原始坐标要如何旋转才能对齐 A 的方向 |
8. 🔸 奇异值分解 U, S, Vh = torch.linalg.svd(A)
得到了三个结果:
U
是一个正交矩阵(左奇异向量)S
是一个一维向量(奇异值)Vh
是另一个正交矩阵的共轭转置(右奇异向量的转置)
手动分解
对矩阵:
用奇异值分解拆成:
我们要知道:
Σ:主对角线是两个奇异值
V:来自
的特征向量
U:由
的特征向量组成
所有特征值的平方根就是奇异值
🧮 步骤一:计算
🧮 步骤二:对 求特征值
设:
展开:
推导公式
解:
🧮步骤三:奇异值就是特征值的平方根!
这就得到了:
这和 PyTorch 给出的数完全一致!
🧮步骤四:找 V(右奇异向量)
它们就是 对应的特征向量。你可以用如下方法算:
假设特征值是 λ=29.87,代入:
我们已经求出:
我们要解这个特征方程:
比如对于最大特征值 ,我们要求解:
解出这个方程组,可以得到 v1,v2比例关系,比如:
再进行单位化(模长为 1),就组成了 V的列向量。
解这个线性方程组即可得到 v1
, v2
,再正交化就是 V
。过程与特征向量计算一样。
🧮步骤五:找 U(左奇异向量)
使用公式:
这也能求出 U
的列向量。
S = [5.4649, 0.3659] # 奇异值
Vh = [[-0.5760, -0.8174], [-0.8174, 0.5760]] # V 的转置
🎉 最终理解:
步骤 | 数字来源 |
---|---|
Σ | 来自 ![]() |
V | 是 ![]() |
U | 用公式 ![]() |
初始矩阵:
A = [[1, 2],
[3, 4]]
B = [[5, 6],
[7, 8]]
奇异值分解:
U:
tensor([[-0.4046, -0.9145],
[-0.9145, 0.4046]])
S:
tensor([[5.4650, 0.0000],
[0.0000, 0.3660]])
Vh (共轭转置):
tensor([[-0.5760, -0.8174],
[ 0.8174, -0.5760]])
矩阵范数
9. 🔸 Frobenius范数 torch.linalg.matrix_norm(A, ord='fro')
10. 🔸 谱范数(2范数) torch.linalg.matrix_norm(A, ord=2)
这是最大奇异值: