【机器学习&深度学习】线性代数

发布于:2025-06-27 ⋅ 阅读:(19) ⋅ 点赞:(0)

目录

一、线性代数的作用

二、 线性代数到底“干了什么”?

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 最大间隔超平面:点积、投影、线性变换


三、为什么要学它?

原因 解释
📐 理解几何 向量、线性变换、投影、旋转、缩放
💡 打通 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)

这是最大奇异值:


网站公告

今日签到

点亮在社区的每一天
去签到