
目录一个有趣的问题什么是矩阵的秩为什么要计算秩高斯消元为什么能求秩消元过程消元流程图手工实现高斯消元测试代码输出消元过程NumPy中的实现为什么机器学习关心秩PCA为什么要看秩高斯消元与行列式的关系一个工程案例总结一个有趣的问题假设有两个矩阵矩阵A[ [1 2] [3 4] ]矩阵B[ [1 2] [2 4] ]两个矩阵看起来都拥有2行 2列似乎包含同样多的信息。但实际上矩阵A的秩 2 矩阵B的秩 1为什么因为矩阵B的第二行 第一行 × 2第二行的信息完全重复。换句话说虽然写了两行 但实际只提供了一行有效信息这就是矩阵秩Rank的含义。什么是矩阵的秩矩阵的秩可以理解为矩阵中线性无关行列的最大数量例如[ [1 2] [2 4] ]第二行依赖第一行。因此Rank 1而[ [1 2] [3 4] ]两行互不依赖。因此Rank 2为什么要计算秩矩阵的秩在机器学习中非常重要。例如特征是否冗余 数据是否可逆 PCA降维 最小二乘法 神经网络参数分析都会涉及秩。甚至可以说秩描述了一个矩阵真正拥有多少有效信息。高斯消元为什么能求秩观察矩阵[ [1 2] [2 4] ]我们对第二行进行变换R2 R2 - 2R1得到[ [1 2] [0 0] ]发现第二行变成全0说明第二行没有提供新的信息因此非零行数量 矩阵秩这就是高斯消元求秩的核心思想。消元过程以矩阵[ [1 2 3] [2 4 6] [1 1 1] ]为例。第一步使用第一行消去第二行R2 R2 - 2R1得到[ [1 2 3] [0 0 0] [1 1 1] ]第二步继续消去第三行R3 R3 - R1得到[ [1 2 3] [0 0 0] [0 -1 -2] ]最终两行非零所以Rank 2消元流程图手工实现高斯消元首先定义函数def matrix_rank(matrix): A [row[:] for row in matrix] rows len(A) cols len(A[0]) rank 0 row 0 for col in range(cols): pivot row while ( pivot rows and A[pivot][col] 0 ): pivot 1 if pivot rows: continue A[row], A[pivot] ( A[pivot], A[row] ) for r in range(row 1, rows): factor ( A[r][col] / A[row][col] ) for c in range(col, cols): A[r][c] - ( factor * A[row][c] ) rank 1 row 1 return rank测试代码测试矩阵A [ [1,2], [2,4] ] print(matrix_rank(A))输出1再测试A [ [1,2], [3,4] ] print(matrix_rank(A))输出2输出消元过程为了观察算法运行过程def print_matrix(A): for row in A: print(row) print(- * 30)在消元后加入print_matrix(A)即可看到每一步矩阵如何变化非常适合调试。NumPy中的实现实际开发中当然不会自己手写。NumPy已经提供np.linalg.matrix_rank()示例import numpy as np A np.array([ [1,2], [2,4] ]) print( np.linalg.matrix_rank(A) )输出1为什么机器学习关心秩假设训练数据年龄 工资 年龄 × 2其中年龄 × 2完全由年龄决定。那么特征矩阵列之间存在线性相关矩阵秩下降。此时模型容易出现多重共线性影响训练效果。PCA为什么要看秩PCA的目标删除冗余维度例如100个特征但实际秩只有20说明80个维度都是冗余信息完全可以降维。高斯消元与行列式的关系你上一篇文章讲过递归求行列式时间复杂度O(n!)非常恐怖。而高斯消元O(n³)快得多。因此现代数学库np.linalg.det()实际上也会借助消元思想。一个工程案例假设10000个样本 500个特征训练前rank np.linalg.matrix_rank(X)结果487说明500个特征 只有487个有效维度存在13个冗余特征这时就可以考虑特征选择 PCA降维 删除共线特征提升模型性能。总结高斯消元法不仅仅是大学线性代数课上的内容。它实际上是现代科学计算的重要基础。核心思想不断消除重复信息最终得到行阶梯矩阵然后统计非零行数量即可得到矩阵秩从机器学习的角度看秩 矩阵真实拥有的信息量因此求秩 本质是在判断 数据到底有多少有效维度这也是高斯消元法直到今天仍然被广泛应用于数值计算、机器学习和数据科学的重要原因。