矩阵乘法与Numpy

时间:2010-08-27 01:00:11

标签: python numpy matrix-multiplication

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

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

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

谢谢。

4 个答案:

答案 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是对角矩阵(我现在没有机会证明它),这个公式应该有效。