アフィニティ行列 A と対角行列 D があるとします。Python で nympy を使用してラプラシアン行列を計算するにはどうすればよいですか?
L = D^(-1/2) AD^(1/2)
現在、L = D**(-1/2) * A * D**(1/2) を使用しています。これは正しい方法ですか?
ありがとうございました。
アフィニティ行列 A と対角行列 D があるとします。Python で nympy を使用してラプラシアン行列を計算するにはどうすればよいですか?
L = D^(-1/2) AD^(1/2)
現在、L = D**(-1/2) * A * D**(1/2) を使用しています。これは正しい方法ですか?
ありがとうございました。
array
の代わりにnumpy を使用することをお勧めします。ユーザー ガイドのこの段落matrix
を参照してください。一部の応答の混乱は、何がうまくいかないかの例です...特に、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)))
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 を使用して float 除算を強制することもできます。
それ以外は、私には正しいように見えます。
編集:
以前は行列ではなく、numpy 配列を累乗しようとしていましたが、これは で動作しD**.5
ます。numpy.power を使用して、要素ごとに行列を累乗できます。だからあなたはただ使うでしょう
from numpy import power
power(D, -.5) * A * power(D, .5)
numpy には行列の平方根関数がありますか? 次に、 (D**(1/2)) の代わりに sqrt(D) を実行できます
多分式は本当に書かれるべきです
L = (D**(-1/2)) * A * (D**(1/2))
以前のコメントに基づいて、この式は D が対角行列である場合に機能するはずです (私は今それを証明する機会がありません)。