在numpy中改变特征值归一化

时间:2015-06-25 15:04:12

标签: python numpy eigenvector

我想编写一个返回无向图的连通分量的函数。例如,对于具有五个节点和两个连接组件的图(节点0,1,3,4连接且节点2被隔离),它将返回两个向量

[1, 1, 0, 1, 1]
[0, 0, 1, 0, 0]

如果连接了两个节点则为1,否则为零。

我使用图拉普拉斯算法,对于无向图,它是对称的实矩阵。我使用Numpy来计算它的特征值和特征向量。

[evalues, evectors] = numpy.linalg.eigh(laplacian)
indices = evalues < 0.00000001
evectors = numpy.transpose(evectors)
relevant_evectors = evectors[indices]

eigh返回标准化的特征向量。例如,在上面的例子中,relvant_evectors是:

[[-0.49316146 -0.49316146  0.16482443 -0.49316146 -0.49316146]
 [-0.08241221 -0.08241221 -0.98632292 -0.08241221 -0.08241221]]

因此,作为下一步,我想将related_eigenvectos转换为仅包含零和上面的那些。我可以通过粗暴地搜索和替换值来做到这一点。但有更优雅的方式来做到这一点吗?

1 个答案:

答案 0 :(得分:0)

具有两种元素的向量数组可以转换为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)
相关问题