# 线性代数与机器学习工程应用教程 --- ## 目录 1. [基础篇:线性代数核心概念](#一基础篇线性代数核心概念) 2. [应用篇:机器学习中的线性代数](#二应用篇机器学习中的线性代数) 3. [工程篇:NumPy实现与优化](#三工程篇numpy实现与优化) 4. [实战案例](#四实战案例) --- ## 一、基础篇:线性代数核心概念 ### 1.1 向量 (Vector) #### 定义 向量是既有大小又有方向的量,可以表示为有序的数字数组。 ``` v = [v₁, v₂, v₃, ..., vₙ]ᵀ ``` #### 基本运算 **向量加法** ``` u + v = [u₁+v₁, u₂+v₂, ..., uₙ+vₙ]ᵀ ``` **数乘** ``` αv = [αv₁, αv₂, ..., αvₙ]ᵀ ``` **点积(内积)** ``` u · v = u₁v₁ + u₂v₂ + ... + uₙvₙ = Σ(uᵢvᵢ) ``` **几何意义**:点积 = |u||v|cos(θ),表示两个向量的相似程度 **叉积(外积)**(仅3维) ``` u × v = [u₂v₃-u₃v₂, u₃v₁-u₁v₃, u₁v₂-u₂v₁]ᵀ ``` #### 范数(长度) **L2范数(欧几里得范数)** ``` ||v||₂ = √(v₁² + v₂² + ... + vₙ²) ``` **L1范数(曼哈顿范数)** ``` ||v||₁ = |v₁| + |v₂| + ... + |vₙ| ``` **L∞范数(最大范数)** ``` ||v||∞ = max(|v₁|, |v₂|, ..., |vₙ|) ``` --- ### 1.2 矩阵 (Matrix) #### 定义 矩阵是由 m×n 个数排列成的矩形阵列。 ``` A = [a₁₁ a₁₂ ... a₁ₙ] [a₂₁ a₂₂ ... a₂ₙ] [... ... ... ... ] [aₘ₁ aₘ₂ ... aₘₙ] ``` #### 基本运算 **矩阵加法** ``` C = A + B,其中 cᵢ = aᵢ + bᵢ ``` **数乘** ``` C = αA,其中 cᵢ = α·aᵢ ``` **矩阵乘法** ``` C = AB,其中 cᵢ = Σ(aᵢₖ·bₖⱼ) for k=1 to n ``` **重要性质**: - 不满足交换律:AB ≠ BA - 满足结合律:(AB)C = A(BC) - 满足分配律:A(B+C) = AB + AC **转置** ``` (Aᵀ)ᵢ = Aᵢ ``` 性质:(AB)ᵀ = BᵀAᵀ --- ### 1.3 特殊矩阵 **单位矩阵 I** ``` I = [1 0 ... 0] [0 1 ... 0] [... ... ... ] [0 0 ... 1] ``` 性质:AI = IA = A **对角矩阵** ``` D = diag(d₁, d₂, ..., dₙ) ``` **对称矩阵** ``` A = Aᵀ ``` **正交矩阵** ``` QᵀQ = QQᵀ = I ``` 性质:Q⁻¹ = Qᵀ,保持向量长度不变 --- ### 1.4 矩阵的逆 #### 定义 对于方阵A,如果存在B使得 AB = BA = I,则B称为A的逆矩阵,记为A⁻¹。 #### 求逆方法 **2×2矩阵** ``` A = [a b] A⁻¹ = 1/(ad-bc) [ d -b] [c d] [-c a] ``` **高斯消元法**(通用方法) **伪逆(Moore-Penrose逆)** 对于非方阵或奇异矩阵,使用伪逆 A⁺。 --- ### 1.5 行列式 (Determinant) #### 定义 行列式是一个将方阵映射到标量的函数。 **2×2矩阵** ``` |a b| = ad - bc |c d| ``` **3×3矩阵** ``` |a b c| |d e f| = a(ei-fh) - b(di-fg) + c(dh-eg) |g h i| ``` #### 几何意义 - |det(A)| 表示矩阵A对空间的体积缩放比例 - det(A) = 0 表示矩阵是奇异的(不可逆) --- ### 1.6 特征值与特征向量 #### 定义 对于方阵A,如果存在非零向量v和标量λ使得: ``` Av = λv ``` 则λ称为特征值,v称为对应的特征向量。 #### 求解方法 ``` Av = λv Av - λv = 0 (A - λI)v = 0 ``` 有非零解的条件:det(A - λI) = 0(特征方程) #### 性质 - 特征值的和 = 矩阵的迹(对角线元素之和) - 特征值的积 = 行列式 - 对称矩阵的特征值都是实数,特征向量正交 --- ### 1.7 矩阵分解 #### LU分解 ``` A = LU ``` 其中L是下三角矩阵,U是上三角矩阵。 应用:解线性方程组 Ax = b #### QR分解 ``` A = QR ``` 其中Q是正交矩阵,R是上三角矩阵。 应用:最小二乘法、特征值计算 #### 特征分解 ``` A = PDP⁻¹ ``` 其中P是特征向量组成的矩阵,D是对角矩阵(特征值)。 应用:矩阵幂运算、微分方程求解 #### 奇异值分解 (SVD) ``` A = UΣVᵀ ``` 其中U和V是正交矩阵,Σ是对角矩阵(奇异值)。 **重要性质**: - 任何矩阵都可以进行SVD - 奇异值σ₁ ≥ σ₂ ≥ ... ≥ σᵣ ≥ 0 - 奇异值的平方 = AᵀA的特征值 --- ## 二、应用篇:机器学习中的线性代数 ### 2.1 数据表示 #### 特征矩阵 ``` X = [x₁₁ x₁₂ ... x₁d] ← 样本1 [x₂₁ x₂₂ ... x₂d] ← 样本2 [... ... ... ... ] [xₙ₁ xₙ₂ ... xₙd] ← 样本n ↑ ↑ ↑ 特征1 特征2 特征d ``` n个样本,每个样本d个特征 #### 标签向量 ``` y = [y₁, y₂, ..., yₙ]ᵀ ``` --- ### 2.2 线性回归 #### 模型 ``` y = Xw + b ``` 其中w是权重向量,b是偏置。 #### 最小二乘法求解 目标:最小化 ||Xw - y||² 解析解: ``` w = (XᵀX)⁻¹Xᵀy ``` **问题**:XᵀX可能不可逆(特征数大于样本数,或多重共线性) **解决方案**: - 正则化:w = (XᵀX + λI)⁻¹Xᵀy - 使用伪逆:w = X⁺y --- ### 2.3 主成分分析 (PCA) #### 目标 将高维数据投影到低维空间,保留最大方差。 #### 步骤 **1. 数据中心化** ``` X̃ = X - μ,其中μ是均值向量 ``` **2. 计算协方差矩阵** ``` C = (1/n) X̃ᵀX̃ ``` **3. 特征分解** ``` C = VΛVᵀ ``` **4. 选择前k个特征向量** ``` Vₖ = [v₁, v₂, ..., vₖ](对应最大k个特征值) ``` **5. 投影** ``` Z = X̃Vₖ ``` #### 与SVD的关系 对X̃进行SVD:X̃ = UΣVᵀ V的列就是主成分方向,Σ²/(n-1)就是特征值。 --- ### 2.4 降维与特征提取 #### t-SNE 使用概率分布保持局部结构,涉及大量矩阵运算。 #### 线性判别分析 (LDA) 最大化类间距离,最小化类内距离。 ``` J(w) = (wᵀS_Bw) / (wᵀS_Ww) ``` 其中S_B是类间散度矩阵,S_W是类内散度矩阵。 --- ### 2.5 神经网络中的线性代数 #### 前向传播 ``` zˡ = Wˡaˡ⁻¹ + bˡ aˡ = σ(zˡ) ``` #### 反向传播 ``` δˡ = (Wˡ⁺¹)ᵀδˡ⁺¹ ⊙ σ'(zˡ) ``` #### 批量处理 ``` Z = XW + b ``` X是m×n的批量数据,W是n×k的权重矩阵。 --- ### 2.6 卷积神经网络 #### 卷积操作 使用卷积核(滤波器)在输入上滑动,本质是一种特殊的矩阵乘法。 #### im2col 将卷积转换为矩阵乘法,利用BLAS加速。 --- ### 2.7 注意力机制 #### Self-Attention ``` Attention(Q, K, V) = softmax(QKᵀ/√dₖ)V ``` Q、K、V都是矩阵,整个计算涉及多次矩阵乘法。 --- ### 2.8 推荐系统 #### 矩阵分解 ``` R ≈ PQᵀ ``` 其中R是用户-物品评分矩阵,P是用户特征矩阵,Q是物品特征矩阵。 #### 协同过滤 基于用户相似度或物品相似度,使用余弦相似度等度量。 --- ## 三、工程篇:NumPy实现与优化 ### 3.1 NumPy基础 #### 数组创建 ```python import numpy as np # 从列表创建 a = np.array([1, 2, 3]) # 创建特殊数组 zeros = np.zeros((3, 4)) ones = np.ones((3, 4)) eye = np.eye(3) # 单位矩阵 arange = np.arange(0, 10, 2) # [0, 2, 4, 6, 8] linspace = np.linspace(0, 1, 5) # [0, 0.25, 0.5, 0.75, 1] # 随机数组 rand = np.random.rand(3, 4) # 均匀分布 randn = np.random.randn(3, 4) # 标准正态分布 ``` #### 数组属性 ```python a.shape # 形状 a.ndim # 维度 a.size # 元素总数 a.dtype # 数据类型 ``` --- ### 3.2 矩阵运算 #### 基本运算 ```python # 逐元素运算 a + b a - b a * b # 逐元素乘法 a / b # 矩阵乘法 np.dot(a, b) a @ b # Python 3.5+ np.matmul(a, b) # 转置 a.T np.transpose(a) # 逆矩阵 np.linalg.inv(a) # 行列式 np.linalg.det(a) # 特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(a) # SVD U, S, Vt = np.linalg.svd(a, full_matrices=False) ``` --- ### 3.3 广播机制 NumPy的广播允许不同形状的数组进行运算。 ```python # 标量广播 a = np.array([1, 2, 3]) a + 1 # [2, 3, 4] # 向量广播 a = np.array([[1, 2, 3], [4, 5, 6]]) # shape: (2, 3) b = np.array([10, 20, 30]) # shape: (3,) a + b # [[11, 22, 33], [14, 25, 36]] ``` --- ### 3.4 性能优化 #### 向量化 避免Python循环,使用NumPy的向量化操作。 ```python # 慢 result = [] for i in range(n): result.append(a[i] + b[i]) # 快 result = a + b ``` #### 内存布局 ```python # C-order(行优先)vs F-order(列优先) a = np.array([[1, 2], [3, 4]], order='C') b = np.array([[1, 2], [3, 4]], order='F') # 按行遍历用C-order,按列遍历用F-order ``` #### 使用einsum ```python # 矩阵乘法 np.einsum('ij,jk->ik', A, B) # 批量矩阵乘法 np.einsum('bij,bjk->bik', A, B) # 迹 np.einsum('ii->', A) ``` #### 使用Numba加速 ```python from numba import jit @jit(nopython=True) def fast_function(x): return x ** 2 ``` --- ### 3.5 稀疏矩阵 对于稀疏数据,使用scipy.sparse节省内存。 ```python from scipy import sparse # 创建稀疏矩阵 A = sparse.csr_matrix((data, (row_ind, col_ind)), shape=(1000, 1000)) # 稀疏矩阵乘法 B = A @ A.T # 转回稠密矩阵(小心内存!) A_dense = A.toarray() ``` --- ## 四、实战案例 ### 案例1:使用PCA进行图像压缩 ```python import numpy as np from sklearn.decomposition import PCA import matplotlib.pyplot as plt # 加载图像(灰度) image = plt.imread('image.jpg') # 对每个颜色通道进行PCA compressed = np.zeros_like(image) n_components = 50 # 保留50个主成分 for i in range(3): # RGB三个通道 pca = PCA(n_components=n_components) transformed = pca.fit_transform(image[:, :, i]) compressed[:, :, i] = pca.inverse_transform(transformed) # 计算压缩比 original_size = image.shape[0] * image.shape[1] * 3 compressed_size = n_components * (image.shape[0] + image.shape[1]) * 3 print(f"压缩比: {original_size / compressed_size:.2f}x") ``` --- ### 案例2:使用SVD进行推荐系统 ```python import numpy as np class SVDRecommender: def __init__(self, n_factors=50): self.n_factors = n_factors def fit(self, R): """ R: 用户-物品评分矩阵 (n_users, n_items) """ # 填充缺失值(均值填充) self.mean = np.nanmean(R) R_filled = np.where(np.isnan(R), self.mean, R) # SVD分解 U, S, Vt = np.linalg.svd(R_filled, full_matrices=False) # 保留前n_factors个奇异值 k = self.n_factors self.U = U[:, :k] self.S = np.diag(S[:k]) self.Vt = Vt[:k, :] def predict(self, user_id, item_id): """预测用户对物品的评分""" pred = self.U[user_id] @ self.S @ self.Vt[:, item_id] return pred + self.mean def recommend(self, user_id, n_recommendations=10): """为用户推荐n个物品""" scores = self.U[user_id] @ self.S @ self.Vt