ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

【Numpy】 第三部分:矩阵运算与线性代数(计算篇)

【Numpy】 第三部分:矩阵运算与线性代数(计算篇) 第三部分矩阵运算与线性代数计算篇矩阵计算与线性代数是科学计算的核心。在摆脱传统商业软件、转向 Python 科学计算生态时深刻理解 NumPy 的底层代数运算规则是构建高效仿真系统如状态空间求解、系统参数辨识的关键所在。本篇将全面解析从标量广播到高级矩阵分解的核心方法。1. 广播机制Broadcasting广播是 NumPy 最强大的特性之一。当两个形状不完全相同的数组进行算术运算时NumPy 会自动触发广播机制通过在虚拟层面上“复制”较小数组的维度使其形状与较大数组对齐从而避免了显式的 Python 循环。核心规则从右往左比对数组的形状维度。如果两个维度相等或者其中一个维度为 1则它们是兼容的。广播运算示例在多智能体系统仿真中常需要给一批智能体的状态矩阵加上同一个全局偏移向量。importnumpyasnp# 3 个智能体的二维坐标矩阵形状 (3, 2)agent_statesnp.array([[10.0,20.0],[15.0,25.0],[5.0,10.0]])# 全局坐标偏移向量形状 (2,)offsetnp.array([-5.0,5.0])# 触发广播(2,) 会被看作 (1, 2)然后在第 0 维复制 3 次匹配 (3, 2)updated_statesagent_statesoffsetprint(updated_states)# [[ 5. 25.]# [10. 30.]# [ 0. 15.]]2. 逐元素运算所有的加减乘除,-,*,/以及数学函数默认都是逐元素Element-wise执行的。这与线性代数中的矩阵乘法完全不同。四则运算与非线性激活Anp.array([[1,2],[3,4]])Bnp.array([[2,2],[2,2]])# 逐元素乘法哈达玛积对应位置元素相乘element_mulA*Bprint(element_mul)# [[2 4]# [6 8]]# 常见非线性数学函数exp_Anp.exp(A)# e^xlog_Anp.log(A)# ln(x)sqrt_Anp.sqrt(A)# 根号 x3. 点积与矩阵乘法这是控制理论与信号处理中最频繁的操作用于计算状态转移xk1AxkBukx_{k1} Ax_k Bu_kxk1​Axk​Buk​或构建增益矩阵。np.dot,,np.matmul这三者在处理二维矩阵时功能等价都执行标准的矩阵乘法。工程实践中最推荐使用 Python 3.5 引入的运算符代码最具可读性。对于高维张量Batch 运算和np.matmul会将最后两个维度视为矩阵进行批量乘法。Anp.array([[1,2],[3,4]])# 状态矩阵 (2, 2)xnp.array([[1],[2]])# 状态向量 (2, 1)# 标准矩阵乘法x_nextA x# 等价于 np.matmul(A, x) 或 np.dot(A, x)print(x_next)# [[ 5]# [11]]np.inner与np.outer内积用于计算向量投影或误差标量外积张量积常用于自适应算法中基于单个误差向量对权重矩阵进行秩一更新。unp.array([1,2,3])vnp.array([0,1,0])# 内积计算对应元素乘积之和inner_prodnp.inner(u,v)print(inner_prod)# 2# 外积u 作为列向量乘 v 作为行向量生成 (3, 3) 矩阵outer_prodnp.outer(u,v)print(outer_prod)# [[0 1 0]# [0 2 0]# [0 3 0]]4. 高级线性代数np.linalg模块np.linalg封装了底层的 BLAS/LAPACK 库用于处理复杂的矩阵代数运算。逆矩阵与伪逆inv,pinv当方阵满秩时使用inv求逆。在无模型自适应控制或数据驱动辨识中输入输出数据矩阵往往不是方阵此时需要通过广义逆伪逆来求解最小二乘参数估计。fromnumpy.linalgimportinv,pinv# 满秩方阵求逆Mnp.array([[1,2],[3,4]])M_invinv(M)# 非方阵求伪逆例如 3 个样本2 个特征的数据矩阵Phinp.array([[1,0],[1,1],[0,1]])Phi_pinvpinv(Phi)print(Phi_pinv)# [[ 0.66666667 0.33333333 -0.33333333]# [-0.33333333 0.33333333 0.66666667]]特征值与特征向量eig,eigh用于分析系统状态矩阵的极点分布判断动力学系统的稳定性。如果已知矩阵是对称阵如李雅普诺夫方程中的PPP矩阵或协方差矩阵使用eigh计算速度更快且在数值上更稳定。fromnumpy.linalgimporteig,eigh Anp.array([[0,1],[-2,-3]])# 计算特征值与特征向量eigenvalues,eigenvectorseig(A)print(系统极点:,eigenvalues)# 系统极点: [-1. -2.] (实部均小于0连续系统稳定)# 对称阵的特征值计算Pnp.array([[2,1],[1,2]])evals_sym,evecs_symeigh(P)矩阵分解与度量svd,cholesky,norm,det奇异值分解SVD常用于降维或能控/能观性分析Cholesky 分解用于正定矩阵范数用于衡量误差大小或协同控制中的相对距离行列式用于判断矩阵是否可逆。fromnumpy.linalgimportsvd,cholesky,norm,det# 1. 奇异值分解 SVD# 将矩阵分解为 U, Sigma, V^TDatanp.array([[1,2,0],[0,1,1]])U,S,Vhsvd(Data)print(奇异值:,S)# 奇异值: [2.31295259 0.81232822]# 2. Cholesky 分解要求方阵对称正定# 分解为下三角矩阵 L满足 P L L.TLcholesky(P)# 3. 向量/矩阵范数默认求解 2-范数/欧几里得距离errnp.array([3,-4])error_normnorm(err)print(误差 L2 范数:,error_norm)# 误差 L2 范数: 5.0# 4. 行列式计算matrix_detdet(M)print(行列式值:,matrix_det)# 行列式值: -2.0000000000000004
返回列表