数学重学 - 24 线性代数实战

这是 数学重学路线图 阶段五的子页面

📌 已有笔记:线性代数入门,本页侧重实战应用


为什么要学线性代数?

线性代数是现代数据科学、机器学习和安全分析的数学语言

推荐系统、搜索引擎排序、恶意软件检测——底层都是向量和矩阵运算

作为安全+大数据+后端方向,线性代数是绕不过去的基础

不需要每个证明都搞懂,但直觉和应用必须到位


一、向量(Vector)

1.1 直觉

向量就是一个有方向和大小的箭头

也可以理解为一组有序的数字,比如 [3, 4] 表示”往右走3,往上走4”

在高维空间中,一个用户的偏好、一段文本的特征,都可以用向量表示

1.2 向量加法

两个向量首尾相连,结果向量从起点指向终点

[a1, a2] + [b1, b2] = [a1+b1, a2+b2]

直觉:走完第一段路再走第二段路,最终位置就是加法结果

1.3 数乘(标量乘法)

数字 × 向量 = 放大/缩小/反转

k × [a1, a2] = [k*a1, k*a2]

k > 1 放大,0 < k < 1 缩小,k < 0 反转方向

1.4 点积(Dot Product)

公式:a · b = a1*b1 + a2*b2 + ... + an*bn

几何意义:a · b = |a| × |b| × cos(θ)

核心理解:点积衡量两个向量的方向一致程度

同向 → 点积为正

垂直 → 点积为零

反向 → 点积为负

这就是余弦相似度的基础!

1.5 叉积(Cross Product)

仅适用于三维向量

结果是一个垂直于两个输入向量的新向量

大小等于两个向量构成的平行四边形面积

在3D图形学中常用来计算法向量

1.6 Python 代码:向量运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np

# 定义向量
a = np.array([3, 4])
b = np.array([1, 2])

# 向量加法
print("加法:", a + b) # [4, 6]

# 数乘
print("数乘:", 2 * a) # [6, 8]

# 点积
print("点积:", np.dot(a, b)) # 3*1 + 4*2 = 11

# 向量的模(长度)
print("|a| =", np.linalg.norm(a)) # 5.0

# 叉积(三维)
a3 = np.array([1, 0, 0])
b3 = np.array([0, 1, 0])
print("叉积:", np.cross(a3, b3)) # [0, 0, 1]

二、矩阵(Matrix)

2.1 直觉

矩阵就是一个变换/映射

把一个输入向量通过矩阵”变换”成输出向量

想象成一个”加工厂”:输入原料(向量),输出产品(新向量)

2.2 矩阵基本运算

矩阵加法:对应位置相加,要求形状相同

数乘:每个元素乘以标量

矩阵乘法(行×列):

A(m×n) × B(n×p) = C(m×p)

C[i][j] = A的第i行与B的第j列的点积

⚠️ 矩阵乘法不满足交换律!AB ≠ BA

这是很多新手踩的坑

2.3 特殊矩阵

单位矩阵 I:对角线为1,其余为0,AI = IA = A

逆矩阵 A⁻¹:AA⁻¹ = I,相当于”撤销变换”

转置矩阵 Aᵀ:行列互换

2.4 Python 代码:矩阵运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import numpy as np

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# 矩阵加法
print("加法:\n", A + B)

# 矩阵乘法(注意不是 A*B,那是逐元素乘)
print("矩阵乘法:\n", A @ B) # 推荐写法
print("矩阵乘法:\n", np.dot(A, B)) # 等价写法

# 验证 AB ≠ BA
print("AB:\n", A @ B)
print("BA:\n", B @ A)
print("AB == BA?", np.array_equal(A @ B, B @ A)) # False

# 逆矩阵
A_inv = np.linalg.inv(A)
print("A的逆:\n", A_inv)
print("A × A⁻¹ ≈ I:\n", A @ A_inv) # 近似单位矩阵

# 转置
print("A的转置:\n", A.T)

三、线性变换

3.1 直觉

线性变换 = 矩阵乘法

旋转、缩放、剪切都可以用矩阵表示

这就是游戏引擎和图形渲染的底层原理

3.2 二维变换矩阵

旋转角度θ:[[cos(θ), -sin(θ)], [sin(θ), cos(θ)]]

缩放 sx, sy:[[sx, 0], [0, sy]]

剪切(水平):[[1, k], [0, 1]]

3.3 Python 代码:变换可视化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import numpy as np
import matplotlib.pyplot as plt

# 原始正方形顶点
square = np.array([[0,0],[1,0],[1,1],[0,1],[0,0]]).T # 2×5

# 旋转 45 度
theta = np.radians(45)
R = np.array([[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]])
rotated = R @ square

# 缩放
S = np.array([[2, 0], [0, 0.5]])
scaled = S @ square

fig, axes = plt.subplots(1, 3, figsize=(12, 4))
for ax, data, title in zip(axes,
[square, rotated, scaled],
["原始", "旋转45°", "缩放(2, 0.5)"]):
ax.plot(data[0], data[1], 'b-o')
ax.set_xlim(-2, 3); ax.set_ylim(-2, 3)
ax.set_aspect('equal'); ax.grid(True)
ax.set_title(title)
plt.tight_layout()
plt.savefig("transform_demo.png")
plt.show()

四、特征值与特征向量

4.1 直觉(简化理解)

对于矩阵 A,如果存在向量 v 和标量 λ,使得 A × v = λ × v

那么 v 就是特征向量,λ 就是特征值

含义:特征向量是被矩阵变换后方向不变的向量

特征值是变换后的缩放倍数

比喻:一阵风吹过(变换),大部分东西都被吹偏了,但旗杆(特征向量)只是被拉长或缩短(特征值),方向没变

4.2 为什么重要

PCA 降维的核心就是找协方差矩阵的特征向量

Google PageRank 算法本质上是求特征向量

系统稳定性分析(特征值决定系统是否发散)

4.3 Python 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np

A = np.array([[4, 2], [1, 3]])

eigenvalues, eigenvectors = np.linalg.eig(A)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)

# 验证 A @ v = λ * v
for i in range(len(eigenvalues)):
v = eigenvectors[:, i]
lam = eigenvalues[i]
print(f"\nA @ v{i} = {A @ v}")
print(f"λ{i} * v{i} = {lam * v}")
print(f"相等? {np.allclose(A @ v, lam * v)}")

五、余弦相似度

5.1 公式

cos(θ) = (a · b) / (|a| × |b|)

值域:[-1, 1]

1 → 方向完全相同(最相似)

0 → 正交(无关)

-1 → 方向完全相反

5.2 为什么不用欧氏距离?

余弦相似度只关心方向,不关心大小

例:两篇文章说的内容一样,但一篇长一篇短,向量大小不同但方向相同

余弦相似度会认为它们相似,欧氏距离会认为它们不同

5.3 Python 代码:余弦相似度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# 方法1:手动实现
def cos_sim(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.array([-1, -2, -3])

print("a与b相似度:", cos_sim(a, b)) # ≈ 0.974
print("a与c相似度:", cos_sim(a, c)) # -1.0(完全相反)

# 方法2:sklearn
vecs = np.array([[1,2,3], [4,5,6], [-1,-2,-3]])
print("相似度矩阵:\n", cosine_similarity(vecs))

六、大数据应用

6.1 推荐系统:用户-物品矩阵

用户对物品的评分构成一个大矩阵

通过矩阵分解(SVD),找到用户和物品的隐含特征向量

预测评分 = 用户向量 · 物品向量

6.2 PCA 降维

高维数据→找到方差最大的方向(主成分)→投影到低维空间

核心步骤:算协方差矩阵→求特征值/特征向量→取最大的几个

6.3 文本向量化

TF-IDF:词频-逆文档频率,把文本变成向量

Word2Vec:把每个词映射成一个向量,语义相近的词向量也相近

之后就可以用余弦相似度算文本相似性

6.4 Python 代码:简单推荐系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np

# 用户-物品评分矩阵(0表示未评分)
# 行=用户,列=物品
ratings = np.array([
[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[1, 0, 0, 4],
[0, 1, 5, 4],
], dtype=float)

# SVD 分解
U, sigma, Vt = np.linalg.svd(ratings, full_matrices=False)

# 保留前2个主成分
k = 2
U_k = U[:, :k]
sigma_k = np.diag(sigma[:k])
Vt_k = Vt[:k, :]

# 重建评分矩阵(预测)
predicted = U_k @ sigma_k @ Vt_k
print("预测评分矩阵:")
print(np.round(predicted, 1))

# 用户0对物品2的预测评分
print(f"\n用户0对物品2的预测评分: {predicted[0, 2]:.2f}")

6.5 Python 代码:PCA 可视化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

# 加载鸢尾花数据集(4维)
iris = load_iris()
X = iris.data # (150, 4) 四维数据
y = iris.target

# PCA 降到2维
pca = PCA(n_components=2)
X_2d = pca.fit_transform(X)

print(f"原始维度: {X.shape[1]}D")
print(f"降维后: {X_2d.shape[1]}D")
print(f"保留信息比例: {sum(pca.explained_variance_ratio_):.2%}")

# 可视化
plt.figure(figsize=(8, 6))
for label in [0, 1, 2]:
mask = y == label
plt.scatter(X_2d[mask, 0], X_2d[mask, 1],
label=iris.target_names[label], alpha=0.7)
plt.xlabel("第一主成分")
plt.ylabel("第二主成分")
plt.title("PCA 降维可视化(鸢尾花数据集)")
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig("pca_demo.png")
plt.show()

七、安全应用

7.1 恶意软件特征向量化

提取恶意软件的行为特征(API调用、网络行为、文件操作等)

每个样本 → 一个特征向量

用余弦相似度找同家族的恶意软件

7.2 异常检测中的距离度量

正常行为构成一个”簇”,异常点距离簇中心很远

马氏距离:考虑了特征之间相关性的距离(用到协方差矩阵的逆)

比欧氏距离更适合检测异常行为

7.3 流量指纹分析

网络流量的统计特征(包大小分布、时间间隔等)构成向量

不同协议/攻击的流量指纹不同

可以用向量相似度进行协议识别和攻击检测


八、后端应用

8.1 搜索引擎相关性排序

查询词 → 向量,文档 → 向量

用余弦相似度排序,最相似的排最前

ElasticSearch 底层就是这个原理

8.2 图形变换

如果涉及前端 Canvas、游戏开发、数据可视化

所有的旋转、缩放、平移都是矩阵运算

WebGL/OpenGL 的变换矩阵就是线性代数的直接应用


九、常见误区

误区1:矩阵乘法满足交换律 → AB = BA

✅ 矩阵乘法一般不满足交换律,AB ≠ BA

误区2:向量只是一组数字

✅ 向量有几何意义(方向+大小),理解几何直觉很重要

误区3:特征值/特征向量没用

✅ PCA、PageRank、系统稳定性分析都依赖它们

误区4:余弦相似度和欧氏距离一样

✅ 余弦关注方向,欧氏关注位置,适用场景不同

误区5:线性代数只在AI领域有用

✅ 安全分析、搜索引擎、推荐系统、图形渲染都需要


十、练习题

练习1:向量点积

计算向量 a = [1, 2, 3] 和 b = [4, -1, 2] 的点积

判断两个向量的夹角是锐角、直角还是钝角

答案:a·b = 4 + (-2) + 6 = 8 > 0,所以是锐角

练习2:矩阵乘法

A = [[1, 2], [3, 4]],B = [[0, 1], [1, 0]]

手动计算 AB 和 BA,验证 AB ≠ BA

答案:AB = [[2,1],[4,3]],BA = [[3,4],[1,2]]

练习3:余弦相似度

用 Python 计算以下三个文档向量的两两余弦相似度

doc1 = [1, 1, 0, 1],doc2 = [1, 1, 1, 0],doc3 = [0, 0, 1, 1]

哪两个文档最相似?

练习4:特征值验证

对矩阵 [[2, 1], [1, 2]],用 numpy 求特征值和特征向量

手动验证 Av = λv 是否成立

练习5:推荐系统

构造一个 5×3 的用户-物品评分矩阵

用 SVD 分解并重建,预测缺失的评分

思考:为什么 SVD 能预测用户没看过的物品的评分?


本页小结

线性代数的核心:向量(表示数据)+ 矩阵(表示变换)

余弦相似度是文本搜索和推荐系统的基石

特征值/特征向量是 PCA 降维和 PageRank 的核心

下一步 → 25-微积分直觉


上一章 目录 下一章
23-回归与预测 数学重学路线图 25-微积分直觉