【问题标题】:Matrix multiplication with Numpy使用 Numpy 进行矩阵乘法
【发布时间】:2010-08-27 01:00:11
【问题描述】:

假设我有一个亲和矩阵 A 和一个对角矩阵 D。如何在 Python 中使用 nympy 计算拉普拉斯矩阵?

L = D^(-1/2) A D^(1/2)

目前,我使用 L = D**(-1/2) * A * D**(1/2)。这是正确的方法吗?

谢谢。

【问题讨论】:

    标签: python numpy matrix-multiplication


    【解决方案1】:

    请注意,建议使用 numpy 的 array 而不是 matrix:请参阅用户指南中的 this paragraph。某些响应中的混淆是可能出错的一个示例......特别是,如果应用于 numpy 数组,D**0.5 和产品是 elementwise,这会给你一个错误的答案.例如:

    import numpy as np
    from numpy import dot, diag
    D = diag([1., 2., 3.])
    print D**(-0.5)
    [[ 1.                 Inf         Inf]
     [        Inf  0.70710678         Inf]
     [        Inf         Inf  0.57735027]]
    

    在您的情况下,矩阵是对角的,因此矩阵的平方根只是另一个对角元素的平方根的对角矩阵。使用numpy数组,方程变为

    D = np.array([1., 2., 3.]) # note that we define D just by its diagonal elements
    A = np.cov(np.random.randn(3,100)) # a random symmetric positive definite matrix
    L = dot(diag(D**(-0.5)), dot(A, diag(D**0.5)))
    

    【讨论】:

      【解决方案2】:

      Numpy 允许您直接对具有正元素和正指数的对角线“矩阵”求幂:

      m = diag(range(1, 11))
      print m**0.5
      

      在这种情况下,结果是您所期望的,因为 NumPy 实际上将幂运算单独应用于 NumPy 数组的每个元素。

      但是,它确实不允许您直接对任何 NumPy 矩阵求幂:

      m = matrix([[1, 1], [1, 2]])
      print m**0.5
      

      产生您观察到的 TypeError(例外情况是指数必须是整数——即使对于可以用正系数对角化的矩阵也是如此)。

      所以,只要你的矩阵 D 是对角线并且你的指数是正的,你应该可以直接使用你的公式。

      【讨论】:

      • 谢谢。 D实际上是一个对角矩阵。我现在可以了。
      • diag(range(1, 11)) 返回一个数组而不是矩阵,是这个原因。
      • 好点。这就是 pberkes 在他的回答中详细阐述的内容。我更新了这个答案以明确这一点。
      【解决方案3】:

      好吧,我看到的唯一问题是,如果您使用的是 Python 2.6.x(没有from __future__ import division),那么 1/2 将被解释为 0,因为它将被视为整数除法。您可以改用 D**(-.5) * A * D**.5 来解决这个问题。您还可以使用 1./2 而不是 1/2 强制浮点除法。

      除此之外,它在我看来是正确的。

      编辑:

      我试图对一个 numpy 数组求幂,而不是之前的矩阵,它适用于 D**.5。您可以使用 numpy.power 对矩阵元素进行取幂。所以你只需使用

      from numpy import power
      power(D, -.5) * A * power(D, .5)
      

      【讨论】:

      • 嗨贾斯汀,感谢您的回复。但是,我收到以下错误:“TypeError: exponent must be an integer”。
      • 你使用的是什么版本的 Numpy?这些是正则矩阵还是稀疏矩阵。使用常规 python 矩阵并将它们提升到幂,我没有任何问题。
      • 从头开始。我很笨,使用 np.array 而不是 np.matrix。
      • 谢谢。我需要的是真正的矩阵运算,而不是点积或类似的东西(数组乘法)。
      • 对角矩阵不也一样吗?
      【解决方案4】:

      numpy 对矩阵有平方根函数吗?然后你可以做 sqrt(D) 而不是 (D**(1/2))

      也许公式真的应该写

      L = (D**(-1/2)) * A * (D**(1/2)) 
      

      根据之前的评论,这个公式应该适用于 D 是对角矩阵的情况(我现在没有机会证明它)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-06
        相关资源
        最近更新 更多