【机器学习&深度学习】线性代数_线性代数与机器学习
目录
一、线性代数的作用
二、 线性代数到底“干了什么”?
2.1 你在学的神经网络:全是线性代数!
2.2 图像处理:图是矩阵,滤波是卷积乘法
2.3 自然语言处理(NLP):词向量是高维向量
2.4 搜索推荐系统:矩阵分解
2.5 物理工程建模
2.6 机器学习核心算法(PCA / SVM / 线性回归)
三、为什么要学它?
四、线性代数操作示例
4.1 执行代码
4.2 运行结果
4.3 代码解析
初始矩阵
基本运算
高级运算
使用新的特征值计算方法
解线性方程组
奇异值分解
矩阵范数
一、线性代数的作用
✅ 一句话回答:
线性代数是理解现代科技(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 最大间隔超平面:点积、投影、线性变换
三、为什么要学它?
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}BX = 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
奇异值分解
总结(一句话记忆):
奇异值分解就是把一个矩阵拆成:先旋转 → 再拉伸 → 再旋转回来的过程。
📦 举个例子直观对比:




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 的转置
🎉 最终理解:



初始矩阵: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)
这是最大奇异值: