【问题标题】:Raise diagonal matrix to the negative power 1/2将对角矩阵提高到负幂 1/2
【发布时间】:2015-03-03 04:40:36
【问题描述】:

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

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 函数引发TypeError: exponent must be an integer 和numpy.power 函数引发RuntimeWarning: divide by zero encountered in power 来计算D^-1/2。

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

【问题讨论】:

  • 请发布数组的repr 输出,以便其他人可以简单地复制粘贴它们。
  • @AshwiniChaudhary 已更新。

标签: python numpy matrix


【解决方案1】:

如果您可以更新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.        ]])

【讨论】:

    【解决方案2】:

    我通过计算 thro' 数学术语得到了答案,但我希望看到任何直截了当的单线 :)

    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

    【讨论】:

      【解决方案3】:

      您可以执行以下操作:

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

      然后您将避免收到警告: RuntimeWarning: 除以零时遇到的幂

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

      【讨论】:

      • 注意:如果您的 D 矩阵在其非对角元素中具有浮点数 0,则此方法将不起作用。它们必须是整数。
      • 我用 float 0 尝试过。它确实有效,数字不必是整数。简单的例子是 D = np.array([0.5, 0.4, 0.016, 0.064, 0]) ; np.power(D,-1/2, 其中=(D!=0))。也许我没明白你的意思?
      猜你喜欢
      • 2018-07-12
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多