5

如何在 Python 中找到拉普拉斯算子 (L) 的外野手向量?

我可以使用以下方法获得特征值和特征向量:特征值,特征向量 = linalg.eig(L)

我假设 python 不会按顺序返回特征值。

我是否取第二大特征值,然后将其与相应的特征向量匹配(在索引中匹配)?

对特征值排序时,如何处理负值?是按绝对大小排序吗?

谢谢你的帮助

4

2 回答 2

4

好吧,我不知道所涉及的数学,但我会尽力而为。

如果您检查文档linalg.eig实际上返回的特征向量与其对应的特征值的顺序相同。

我可能会做类似的事情:

w, v = linalg.eig(L)
seen = {}
unique_eigenvalues = []
for (x, y) in zip(w, v):
    if x in seen:
        continue
    seen[x] = 1
    unique_eigenvalues.append((x, y))
fiedler = sorted(unique_eigenvalues)[1][1]

默认情况下,Python 按第一个元素排序元组,然后是第二个元素,依此类推,并且数字按照您期望的方式排序(-2 < -1 等)。这假设您的特征值当然并不复杂。

此外,我假设可能存在重复的特征值,并且 Fiedler 向量是与第二小的唯一特征值相关联的特征向量。

于 2012-06-15T15:07:37.817 回答
1

只是一个额外的解决方案:

import numpy as np
import scipy.linalg as la

eig_values, eig_vectors = la.eig(laplacian)
fiedler_pos = np.where(eigvalues.real == np.sort(eig_values.real)[1])[0][0]
fiedler_vector = np.transpose(eig_vectors)[fiedler_pos]

print("Fiedler vector: " + str(fieder_vector.real))

解释:Fiedler 向量具有最小的非零特征值。因此,我们需要对特征值进行排序,并取第二小的一个(顺便说一下,验证零元素是否也在第一位是有意义的)。这是在 中完成的np.sort(eigvalues.real)[1],您可以看到已排序(实际)数组的第二个元素被采用。

现在我们只需要匹配原始数组中的值并获取它的位置。这可以通过np.where()命令方便地完成。结果是括号中定义的所有已发现实例的数组,我们从中取出第一个。该fiedler_pos变量现在包含特征向量中的 fiedler 向量位置。

为了得到向量本身,一种方法是在相关位置使用转置的特征向量矩阵。

于 2020-10-01T15:34:11.613 回答