假设我有一个亲和矩阵A和一个对角线矩阵D。如何使用nympy在Python中计算拉普拉斯矩阵?
L = D^(-1/2) A D^(1/2)
目前,我使用L = D**(-1/2) * A * D**(1/2)。这是正确的方法吗?
谢谢。
L = D^(-1/2) A D^(1/2)
目前,我使用L = D**(-1/2) * A * D**(1/2)。这是正确的方法吗?
谢谢。
array
而不是matrix
:请参见用户指南中的本段。一些回答中的混淆是一个错误的例子...特别是,如果应用于numpy数组,则D**0.5和乘积是逐元素的,这将给出一个错误的答案。例如: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)))
m = diag(range(1, 11))
print m**0.5
但是,它确实不允许您直接对任何NumPy矩阵进行指数运算:
m = matrix([[1, 1], [1, 2]])
print m**0.5
您观察到的TypeError错误是由于指数必须是整数,即使对于可以用正系数对角化的矩阵也是如此。
因此,只要您的矩阵D是对角线的且指数为正,您就可以直接使用公式。
嗯,我唯一看到的问题是,如果你使用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)
NumPy是否有矩阵平方根函数?那么您可以使用sqrt(D)代替(D **(1/2))
也许公式应该真正写成
L = (D**(-1/2)) * A * (D**(1/2))
根据之前的评论,如果D是一个对角矩阵,这个公式应该有效(我现在没有证明的机会)。