You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)的业务场景,比如标准化、度量学习等场景用到的矩阵都属于该类型),可以通过特征值分解手动实现计算,可控性更高:

  1. 对A做特征值分解得到特征值矩阵Λ和正交特征向量矩阵Q,满足 A = Q @ Λ @ Q.T
  2. 对Λ的每个对角元素求-1/2次幂得到Λ^(-1/2)
  3. 最终结果为 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:39:03