如何在 Python 中找到拉普拉斯 (L) 的字段向量?
我可以使用以下方法获取特征值和特征向量:特征值, 特征向量 = linalg.eig(L)
我假设 python 不会按顺序返回特征值。
我是否采用第二大特征值,然后将其与相应的特征向量(索引中的匹配)匹配?
对特征值进行排序时,如何处理负值?排序是按绝对量级排列的吗?
感谢您的帮助
好吧,我不知道所涉及的数学,但我会尽力而为。
如果您检查文档,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 向量是与第二小的唯一特征值相关联的特征向量。
只是一个额外的解决方案:
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))
解释:费德勒向量具有最小的非零特征值。因此,我们需要对特征值进行排序,并取第二个最小的特征值(顺便说一下,验证零元素是否也首先存在是有意义的)。这是在np.sort(eigvalues.real)[1]
中完成的,正如你所看到的排序(实数)数组的第二个元素被采用.
现在我们只需要匹配原始数组中的值并获取其位置。这可以通过np.where()
命令方便地完成。结果是在括号中定义的所有已发现实例的数组,我们从中获取第一个实例。fiedler_pos
变量现在包含特征向量中的费德勒向量位置.
为了得到向量本身,一种方法是在相关位置使用转置的特征向量矩阵。