如何在Python中计算矩阵A^(-1/2)次幂(矩阵逆平方根)
Python计算矩阵的-1/2次幂(A^(-1/2))的实现方法
你遇到的linalg.matrix_power无法正常运行的核心原因是该函数仅支持整数指数输入,无法处理分数次幂的计算需求。针对任意尺寸的矩阵,可通过以下方案实现计算:
通用实现方案
方案1:使用scipy内置分数次幂计算函数(最简便)
scipy的linalg.fractional_matrix_power原生支持分数指数的矩阵幂计算,直接传入-0.5作为指数即可,适配所有合法输入矩阵:
import numpy as np from scipy.linalg import fractional_matrix_power # 示例输入矩阵 A = np.array([[ 0.59484625, 0. , 0. , 0. ], [ 0. , 0.58563893, 0. , 0. ], [ 0. , 0. , 0.58280472, 0. ], [ 0. , 0. , 0. , 0.58216725]]) # 直接计算A^(-1/2) A_neg_half = fractional_matrix_power(A, -0.5) print(A_neg_half)
方案2:基于特征值分解手动实现(适合自定义控制计算流程的场景)
对于对称正定矩阵(也是绝大多数需要计算A^(-1/2)的业务场景,比如标准化、度量学习等场景用到的矩阵都属于该类型),可以通过特征值分解手动实现计算,可控性更高:
- 对A做特征值分解得到特征值矩阵Λ和正交特征向量矩阵Q,满足
A = Q @ Λ @ Q.T - 对Λ的每个对角元素求-1/2次幂得到Λ^(-1/2)
- 最终结果为
A^(-1/2) = Q @ Λ^(-1/2) @ Q.T
代码示例:
import numpy as np # 实对称矩阵用eigh计算的效率和数值稳定性更高 eig_vals, eig_vecs = np.linalg.eigh(A) # 对特征值求-1/2次幂,添加阈值过滤极小特征值避免数值溢出 eig_vals_neg_half = np.where(eig_vals > 1e-10, eig_vals ** (-0.5), 0) # 构造最终结果 A_neg_half = eig_vecs @ np.diag(eig_vals_neg_half) @ eig_vecs.T
注意事项
- 只有正定矩阵才存在实数域的A^(-1/2)结果,如果输入矩阵是非正定的,计算会返回复数结果,需要结合你的业务场景判断结果是否合理
- 对于超大尺寸的稀疏矩阵,建议先使用稀疏矩阵专用的特征分解接口(比如
scipy.sparse.linalg.eigsh)取前k个特征值再计算,避免内存溢出
内容的提问来源于stack exchange,提问作者Hermi
相关产品推荐
相关产品推荐

