在 numpy 中更改特征值归一化
Changing eigenvalue normalization in numpy
我想编写一个 return 无向图连通分量的函数。例如,对于具有五个节点和两个连通分量(节点 0、1、3、4 相连,节点 2 孤立)的图,它将 return 两个向量
[1, 1, 0, 1, 1]
[0, 0, 1, 0, 0]
如果两个节点相连则为 1,否则为 0。
我为此使用拉普拉斯图,对于无向图,它是一个对称的实数矩阵。我正在使用 Numpy 计算它的特征值和特征向量。
[evalues, evectors] = numpy.linalg.eigh(laplacian)
indices = evalues < 0.00000001
evectors = numpy.transpose(evectors)
relevant_evectors = evectors[indices]
eigh returns 个归一化特征向量。例如,在上面的例子中,relvant_evectors 是:
[[-0.49316146 -0.49316146 0.16482443 -0.49316146 -0.49316146]
[-0.08241221 -0.08241221 -0.98632292 -0.08241221 -0.08241221]]
因此,作为下一步,我想将 relevant_eigenvectos 转换为仅包含 0 和 1,如上所示。我可以通过粗暴地搜索和替换值来做到这一点。但是有没有更优雅的方法来做到这一点?
具有两种元素的向量数组可以转换为具有以下内容的 0-1 向量数组:
components = np.where(relevant_evectors < np.mean(relevant_evectors, axis=1), 0, 1)
在这里,取每一行的平均值(因为您转置以获得行向量)。均值以下的元素用0代替,其他用1代替。
就是说,我无法重现您得到的那种载体;我得到的特征向量都是稀疏的,列外有 0 个值。也许我还没有考虑足够复杂的图表。这是我的完整代码版本。
import numpy as np
adjacency = np.zeros((8, 8))
edges = [(0, 1), (0, 7), (2, 3), (4, 5), (5, 6), (4, 6)]
for edge in edges:
adjacency[edge] = 1
adjacency += adjacency.T # symmetric adjacency matrix
laplacian = np.diag(adjacency.sum(axis=0)) - adjacency
[evalues, evectors] = np.linalg.eigh(laplacian)
relevant_evectors = evectors[:, evalues < 1e-7]
components = np.where(np.abs(relevant_evectors) < 1e-7, 0, 1) # Works in my example...
print(components)
我想编写一个 return 无向图连通分量的函数。例如,对于具有五个节点和两个连通分量(节点 0、1、3、4 相连,节点 2 孤立)的图,它将 return 两个向量
[1, 1, 0, 1, 1]
[0, 0, 1, 0, 0]
如果两个节点相连则为 1,否则为 0。
我为此使用拉普拉斯图,对于无向图,它是一个对称的实数矩阵。我正在使用 Numpy 计算它的特征值和特征向量。
[evalues, evectors] = numpy.linalg.eigh(laplacian)
indices = evalues < 0.00000001
evectors = numpy.transpose(evectors)
relevant_evectors = evectors[indices]
eigh returns 个归一化特征向量。例如,在上面的例子中,relvant_evectors 是:
[[-0.49316146 -0.49316146 0.16482443 -0.49316146 -0.49316146]
[-0.08241221 -0.08241221 -0.98632292 -0.08241221 -0.08241221]]
因此,作为下一步,我想将 relevant_eigenvectos 转换为仅包含 0 和 1,如上所示。我可以通过粗暴地搜索和替换值来做到这一点。但是有没有更优雅的方法来做到这一点?
具有两种元素的向量数组可以转换为具有以下内容的 0-1 向量数组:
components = np.where(relevant_evectors < np.mean(relevant_evectors, axis=1), 0, 1)
在这里,取每一行的平均值(因为您转置以获得行向量)。均值以下的元素用0代替,其他用1代替。
就是说,我无法重现您得到的那种载体;我得到的特征向量都是稀疏的,列外有 0 个值。也许我还没有考虑足够复杂的图表。这是我的完整代码版本。
import numpy as np
adjacency = np.zeros((8, 8))
edges = [(0, 1), (0, 7), (2, 3), (4, 5), (5, 6), (4, 6)]
for edge in edges:
adjacency[edge] = 1
adjacency += adjacency.T # symmetric adjacency matrix
laplacian = np.diag(adjacency.sum(axis=0)) - adjacency
[evalues, evectors] = np.linalg.eigh(laplacian)
relevant_evectors = evectors[:, evalues < 1e-7]
components = np.where(np.abs(relevant_evectors) < 1e-7, 0, 1) # Works in my example...
print(components)