【发布时间】: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
假设我有一个亲和矩阵 A 和一个对角矩阵 D。如何在 Python 中使用 nympy 计算拉普拉斯矩阵?
L = D^(-1/2) A D^(1/2)
目前,我使用 L = D**(-1/2) * A * D**(1/2)。这是正确的方法吗?
谢谢。
【问题讨论】:
标签: python numpy matrix-multiplication
请注意,建议使用 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)))
【讨论】:
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 是对角线并且你的指数是正的,你应该可以直接使用你的公式。
【讨论】:
好吧,我看到的唯一问题是,如果您使用的是 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 是对角矩阵的情况(我现在没有机会证明它)。
【讨论】: