线性代数核心概念与实战应用详解

📅 2026/8/12 9:38:56
线性代数核心概念与实战应用详解
一、线性代数是什么线性代数是研究向量、向量空间线性空间、线性变换和线性方程组的数学分支。它是机器学习、数据科学、计算机图形学、量子力学等领域的数学基础。核心思想用线性的方式描述和变换数据。二、标量、向量、矩阵、张量1. 标量Scalar单独的数值0维张量。python# Python表示 scalar 3.14 print(type(scalar)) # class float2. 向量Vector一维数组有方向的量。pythonimport numpy as np # 行向量1×n row_vector np.array([1, 2, 3, 4]) print(row_vector.shape) # (4,) # 列向量n×1 col_vector np.array([[1], [2], [3]]) print(col_vector.shape) # (3, 1)3. 矩阵Matrix二维数组由行和列组成。python# 2×3 矩阵 matrix np.array([ [1, 2, 3], [4, 5, 6] ]) print(matrix.shape) # (2, 3)4. 张量Tensor多维数组是向量和矩阵的推广。python# 3D张量2×3×4 tensor np.random.rand(2, 3, 4) print(tensor.shape) # (2, 3, 4)三、向量运算1. 向量加减法对应元素相加减pythonimport numpy as np a np.array([1, 2, 3]) b np.array([4, 5, 6]) print(a b) # [5 7 9] print(a - b) # [-3 -3 -3]2. 数乘标量×向量pythonk 3 a np.array([1, 2, 3]) print(k * a) # [3 6 9]3. 点积内积几何意义a⋅b∣a∣∣b∣cos⁡θa⋅b∣a∣∣b∣cosθ用于计算相似度、投影等。pythona np.array([1, 2, 3]) b np.array([4, 5, 6]) # 方法1np.dot dot1 np.dot(a, b) print(dot1) # 32 1*4 2*5 3*6 # 方法2a b dot2 a b print(dot2) # 32 # 手动计算 dot_manual sum(a[i] * b[i] for i in range(len(a))) print(dot_manual) # 324. 向量长度模、范数pythonv np.array([3, 4]) # L2范数欧几里得距离 l2_norm np.linalg.norm(v) print(l2_norm) # 5.0 勾股定理3²4²5² # L1范数曼哈顿距离 l1_norm np.linalg.norm(v, ord1) print(l1_norm) # 7 |3||4| # 手动计算 manual_norm (3**2 4**2) ** 0.5 print(manual_norm) # 5.05. 向量夹角余弦相似度pythondef cosine_similarity(a, b): 计算两个向量的余弦相似度范围[-1, 1] dot np.dot(a, b) norm_a np.linalg.norm(a) norm_b np.linalg.norm(b) return dot / (norm_a * norm_b) a np.array([1, 0]) b np.array([0, 1]) print(cosine_similarity(a, b)) # 0.0 垂直不相关 a np.array([1, 2, 3]) b np.array([2, 4, 6]) # b 2a方向相同 print(cosine_similarity(a, b)) # 1.0 完全相似 a np.array([1, 2, 3]) b np.array([-1, -2, -3]) # 反向 print(cosine_similarity(a, b)) # -1.0 完全相反6. 叉积向量积仅适用于三维向量结果是与两个向量都垂直的向量。pythona np.array([1, 2, 3]) b np.array([4, 5, 6]) cross np.cross(a, b) print(cross) # [-3 6 -3] # 验证a·(a×b) 0, b·(a×b) 0 print(np.dot(a, cross)) # 0 print(np.dot(b, cross)) # 0 # 叉积的模 |a||b|sinθ等于平行四边形面积四、矩阵运算1. 矩阵加减法对应元素相加减pythonA np.array([[1, 2], [3, 4]]) B np.array([[5, 6], [7, 8]]) print(A B) # [[ 6 8] # [10 12]] print(A - B) # [[-4 -4] # [-4 -4]]2. 数乘矩阵pythonA np.array([[1, 2], [3, 4]]) k 2 print(k * A) # [[2 4] # [6 8]]3. 矩阵乘法规则A(m×n) × B(n×p) C(m×p)pythonA np.array([[1, 2, 3], [4, 5, 6]]) # 2×3 B np.array([[7, 8], [9, 10], [11, 12]]) # 3×2 C np.matmul(A, B) # 或 A B print(C) # [[ 58 64] # [139 154]] # C[0,0] 1*7 2*9 3*11 58 # C[0,1] 1*8 2*10 3*12 644. 矩阵转置行变列列变行。pythonA np.array([[1, 2, 3], [4, 5, 6]]) print(A.T) # [[1 4] # [2 5] # [3 6]] # 性质(Aᵀ)ᵀ A print((A.T).T A) # True5. 矩阵的迹对角线之和pythonA np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) trace np.trace(A) print(trace) # 15 1596. 矩阵的秩几何意义矩阵列向量张成空间的维数。pythonA np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) rank np.linalg.matrix_rank(A) print(rank) # 2 第三行 2×第二行 - 第一行 # 满秩矩阵 B np.array([[1, 2], [3, 4]]) print(np.linalg.matrix_rank(B)) # 2五、特殊矩阵1. 单位矩阵Identity Matrix对角线为1其余为0。pythonI np.eye(3) print(I) # [[1. 0. 0.] # [0. 1. 0.] # [0. 0. 1.]] # 性质A·I I·A A A np.array([[1, 2], [3, 4]]) I2 np.eye(2) print(A I2) # [[1. 2.] # [3. 4.]]2. 对角矩阵非对角线元素为0。pythonD np.diag([1, 2, 3]) print(D) # [[1 0 0] # [0 2 0] # [0 0 3]] # 提取对角线 A np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) diag np.diag(A) print(diag) # [1 5 9]3. 对称矩阵A AᵀpythonA np.array([[1, 2, 3], [2, 4, 5], [3, 5, 6]]) print(np.allclose(A, A.T)) # True # 协方差矩阵就是对称矩阵 data np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) cov np.cov(data) print(np.allclose(cov, cov.T)) # True六、行列式几何意义矩阵变换对面积/体积的缩放倍数。pythonA np.array([[2, 0], [0, 3]]) det np.linalg.det(A) print(det) # 6.0 面积缩放6倍 # 奇异性行列式为0矩阵不可逆 B np.array([[1, 2], [2, 4]]) # 第二行 2×第一行 print(np.linalg.det(B)) # 0.0七、逆矩阵只有方阵且满秩行列式≠0才有逆矩阵。性质A·A⁻¹ A⁻¹·A IpythonA np.array([[4, 7], [2, 6]]) det np.linalg.det(A) print(det) # 10.0 A_inv np.linalg.inv(A) print(A_inv) # [[ 0.6 -0.7] # [-0.2 0.4]] # 验证A × A⁻¹ I print(A A_inv) # [[1. 0.] # [0. 1.]] # 解线性方程组Ax b b np.array([1, 2]) x A_inv b print(x) # [-0.8 0.6]八、线性方程组1. 增广矩阵与高斯消元法python# 解方程组 # x 2y 5 # 3x 4y 6 A np.array([[1, 2], [3, 4]]) b np.array([5, 6]) # 方法1逆矩阵法 x np.linalg.inv(A) b print(x) # [-4. 4.5] # 方法2solve函数 x np.linalg.solve(A, b) print(x) # [-4. 4.5] # 验证A·x b print(A x) # [5. 6.]2. 最小二乘法超定方程组当方程个数多于未知数时求近似解。python# 数据点(1, 2), (2, 3), (3, 5) # 拟合直线 y ax b X np.array([[1, 1], [2, 1], [3, 1]]) # 特征矩阵添加截距项 y np.array([2, 3, 5]) # 最小二乘解a (XᵀX)⁻¹Xᵀy a np.linalg.inv(X.T X) X.T y print(a) # [1.5 0.333] 即 y 1.5x 0.333 # 使用numpy内置函数 a np.linalg.lstsq(X, y, rcondNone)[0] print(a) # [1.5 0.333]九、特征值与特征向量核心概念A·v λ·vλ特征值标量v特征向量方向不变只被缩放pythonA np.array([[4, 2], [1, 3]]) # 计算特征值和特征向量 eigenvalues, eigenvectors np.linalg.eig(A) print(特征值:, eigenvalues) # [5. 2.] print(特征向量:, eigenvectors) # 列向量 # [[ 0.894 -0.707] # [ 0.447 0.707]] # 验证A·v λ·v for i in range(len(eigenvalues)): v eigenvectors[:, i] lambda_ eigenvalues[i] print(np.allclose(A v, lambda_ * v)) # True特征分解对角化如果矩阵可对角化A Q·Λ·Q⁻¹python# 使用上面的矩阵 Q eigenvectors Lambda np.diag(eigenvalues) Q_inv np.linalg.inv(Q) # 重构原矩阵 A_reconstructed Q Lambda Q_inv print(np.allclose(A, A_reconstructed)) # True十、奇异值分解SVD核心思想任意矩阵都可以分解为三个矩阵的乘积。A U·Σ·VᵀU左奇异向量正交矩阵Σ对角矩阵奇异值V右奇异向量正交矩阵pythonA np.array([[1, 2, 3], [4, 5, 6]]) U, S, Vt np.linalg.svd(A, full_matricesFalse) print(U shape:, U.shape) # (2, 2) print(S:, S) # [9.51 0.51] 奇异值 print(Vt shape:, Vt.shape) # (2, 3) # 重构原矩阵 Sigma np.diag(S) A_reconstructed U Sigma Vt print(np.allclose(A, A_reconstructed)) # True # 应用降维PCA的核心 # 取前k个最大的奇异值实现数据压缩 k 1 A_compressed U[:, :k] np.diag(S[:k]) Vt[:k, :] print(A_compressed)十一、向量空间与基1. 线性组合与张成python# 向量组 v1 np.array([1, 0]) v2 np.array([0, 1]) # 线性组合c1*v1 c2*v2 c1, c2 2, 3 result c1 * v1 c2 * v2 print(result) # [2 3]2. 线性相关与线性无关python# 线性相关存在不全为0的系数使组合为0 v1 np.array([1, 2]) v2 np.array([2, 4]) # v2 2*v1 # 组成矩阵看秩 A np.column_stack([v1, v2]) print(np.linalg.matrix_rank(A)) # 1 2线性相关 # 线性无关 v3 np.array([1, 2]) v4 np.array([3, 4]) # 不成比例 B np.column_stack([v3, v4]) print(np.linalg.matrix_rank(B)) # 2 2线性无关3. 标准基python# R²的标准基 e1 np.array([1, 0]) e2 np.array([0, 1]) # R³的标准基 e1_3d np.array([1, 0, 0]) e2_3d np.array([0, 1, 0]) e3_3d np.array([0, 0, 1])十二、线性变换几何意义保持直线和平行线的变换。常见变换的矩阵表示pythonimport matplotlib.pyplot as plt # 定义变换矩阵 def apply_transform(v, matrix): return matrix v # 1. 旋转逆时针旋转θ角 theta np.pi / 4 # 45度 R np.array([[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]]) v np.array([1, 0]) v_rotated apply_transform(v, R) print(旋转后的向量:, v_rotated) # [0.707 0.707] # 2. 缩放 S np.array([[2, 0], [0, 3]]) v_scaled apply_transform(v, S) print(缩放后的向量:, v_scaled) # [2 0] # 3. 投影投影到x轴 P np.array([[1, 0], [0, 0]]) v np.array([1, 2]) v_projected apply_transform(v, P) print(投影后的向量:, v_projected) # [1 0] # 4. 剪切 H np.array([[1, 0.5], [0, 1]]) v np.array([1, 1]) v_sheared apply_transform(v, H) print(剪切后的向量:, v_sheared) # [1.5 1. ]十三、实战场合应用1. PCA降维python# 生成三维数据 np.random.seed(42) data np.random.randn(100, 3) data[:, 1] data[:, 0] * 0.8 np.random.randn(100) * 0.1 data[:, 2] data[:, 0] * 0.5 np.random.randn(100) * 0.2 # 中心化 mean np.mean(data, axis0) centered data - mean # 协方差矩阵 cov centered.T centered / (len(data) - 1) # 特征分解 eigenvalues, eigenvectors np.linalg.eig(cov) # 按特征值排序 idx np.argsort(eigenvalues)[::-1] eigenvectors eigenvectors[:, idx] # 降维到2维 k 2 proj_matrix eigenvectors[:, :k] data_pca centered proj_matrix print(原始数据形状:, data.shape) # (100, 3) print(PCA后形状:, data_pca.shape) # (100, 2) print(保留方差比例:, np.sum(eigenvalues[:k]) / np.sum(eigenvalues))2. 图像压缩python# 模拟图像压缩使用SVD import numpy as np # 创建简单灰度图8×8矩阵 image np.array([ [0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 0, 0, 0, 0], [0, 1, 1, 1, 0, 0, 0, 0], [0, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 1, 0], [0, 0, 0, 0, 1, 1, 1, 0], [0, 0, 0, 0, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0] ]) # SVD分解 U, S, Vt np.linalg.svd(image) # 保留前k个奇异值进行压缩 def compress_image(img, k): U, S, Vt np.linalg.svd(img) return U[:, :k] np.diag(S[:k]) Vt[:k, :] k_values [1, 2, 4, 8] for k in k_values: compressed compress_image(image, k) print(fk{k}, 压缩率{k*8*2/(8*8):.1%})3. 推荐系统协同过滤python# 用户-物品评分矩阵 ratings np.array([ [5, 3, 0, 1], [4, 0, 0, 1], [1, 1, 0, 5], [1, 0, 0, 4], [0, 1, 5, 4], ]) # SVD分解 U, S, Vt np.linalg.svd(ratings, full_matricesFalse) # 降维到2维 k 2 U_k U[:, :k] S_k np.diag(S[:k]) Vt_k Vt[:k, :] # 重构评分填充缺失值 ratings_pred U_k S_k Vt_k print(ratings_pred)十四、知识点速查表知识点公式/定义计算代码向量点积a·b Σaᵢbᵢnp.dot(a, b)向量叉积a×b 垂直向量np.cross(a, b)L2范数|v|₂ √(Σvᵢ²)np.linalg.norm(v)矩阵乘法(AB)ᵢⱼ ΣAᵢₖBₖⱼA B转置(Aᵀ)ᵢⱼ AⱼᵢA.T逆矩阵A·A⁻¹ Inp.linalg.inv(A)行列式det(A)np.linalg.det(A)秩rank(A)np.linalg.matrix_rank(A)特征值A·v λ·vnp.linalg.eig(A)SVDA U·Σ·Vᵀnp.linalg.svd(A)解方程组Ax bnp.linalg.solve(A, b)