假设我有一个亲和矩阵A和一个对角矩阵D.如何用nympy计算Python中的拉普拉斯矩阵?
L = D ^( - 1/2)A D ^(1/2)
目前,我使用L = D **( - 1/2)* A * D **(1/2)。这是正确的方法吗?
谢谢。
答案 0 :(得分:4)
请注意,建议使用numpy的array
代替matrix
:请参阅用户指南中的this paragraph。一些响应中的混淆是一个可能出错的例子......特别是D ** 0.5和产品是元素如果应用于numpy数组,这会给你一个错误的答案。例如:
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)))
答案 1 :(得分:2)
Numpy允许您直接使用正元素对对角线矩阵进行取幂:
m = diag(range(1, 11))
print m**0.5
但是,它确实不允许您直接取幂任何矩阵:
m = matrix([[1, 1], [1, 2]])
print m**0.5
生成您观察到的TypeError(异常表示指数必须是整数 - 即使对于可以使用正系数对角化的矩阵)。
因此,只要您的矩阵D是对角线,您就应该能够直接使用您的公式。
答案 2 :(得分:1)
嗯,我看到的唯一问题是如果你使用的是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)
答案 3 :(得分:0)
numpy对矩阵有平方根函数吗?然后你可以做sqrt(D)而不是(D **(1/2))
也许应该真正编写公式
L = (D**(-1/2)) * A * (D**(1/2))
基于之前的评论,如果D是对角矩阵(我现在没有机会证明它),这个公式应该有效。