将对角矩阵提高到负幂 1/2

Raise diagonal matrix to the negative power 1/2

我正在尝试计算具有以下等式的矩阵。

S = (D^−1/2) * W * (D^−1/2)

其中 D 是这种形式的对角矩阵:

array([[ 0.59484625,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.58563893,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.58280472,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.58216725]])

W:

array([[ 0.        ,  0.92311635,  0.94700586,  0.95599748],
       [ 0.92311635,  0.        ,  0.997553  ,  0.99501248],
       [ 0.94700586,  0.997553  ,  0.        ,  0.9995501 ],
       [ 0.95599748,  0.99501248,  0.9995501 ,  0.        ]])

我试图通过使用 numpy 函数 linalg.matrix_power(D,-1/2)numpy.power(D,-1/2)matrix_power 函数计算 D^-1/2 计算 TypeError: exponent must be an integernumpy.power 函数引发 RuntimeWarning: divide by zero encountered in power.

如何计算对角矩阵的负幂 -1/2。请帮忙。

我通过计算数学术语得到了答案,但希望看到任何直接的衬垫:)

def compute_diagonal_to_negative_power():
    for i in range(4):
        for j in range(4):
            if i == j:
                element = D[i][j]
                numerator = 1
                denominator = math.sqrt(element)
                D[i][j] = numerator / denominator
    return D


diagonal_matrix = compute_diagonal_to_negative_power()

S = np.dot(diagonal_matrix, W).dot(diagonal_matrix)
print(S)

"""
[[ 0.          0.32158153  0.32830723  0.33106193]
 [ 0.32158153  0.          0.34047794  0.33923936]
 [ 0.32830723  0.34047794  0.          0.33913718]
 [ 0.33106193  0.33923936  0.33913718  0.        ]]
"""

来源:https://math.stackexchange.com/questions/340321/raising-a-square-matrix-to-a-negative-half-power

如果您可以更新 D(就像您自己的回答),那么只需更新其对角线索引处的项目,然后调用 np.dot:

>>> D[np.diag_indices(4)] = 1/ (D.diagonal()**0.5)
>>> np.dot(D, W).dot(D)
array([[ 0.        ,  0.32158153,  0.32830723,  0.33106193],
       [ 0.32158153,  0.        ,  0.34047794,  0.33923936],
       [ 0.32830723,  0.34047794,  0.        ,  0.33913717],
       [ 0.33106193,  0.33923936,  0.33913717,  0.        ]])

或者创建一个新的 zeros 数组,然后用 1/ (D.diagonal()**0.5):

填充它的对角线元素
>>> arr = np.zeros(D.shape)
>>> np.fill_diagonal(arr, 1/ (D.diagonal()**0.5))
>>> np.dot(arr, W).dot(arr)
array([[ 0.        ,  0.32158153,  0.32830723,  0.33106193],
       [ 0.32158153,  0.        ,  0.34047794,  0.33923936],
       [ 0.32830723,  0.34047794,  0.        ,  0.33913717],
       [ 0.33106193,  0.33923936,  0.33913717,  0.        ]])

您可以执行以下操作:

numpy.power(D,-1/2, where=(D!=0))

然后您将避免收到警告: RuntimeWarning:在 power

中遇到除以零

numpy 会将矩阵上的每个值按元素除以它自己的平方根,它不是零,所以基本上你不会再尝试除以零了。