繁体   English   中英

在numpy中更改特征值标准化

[英]Changing eigenvalue normalization in numpy

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

[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返回归一化的特征向量。 例如,在上述情况下,relvant_evectors为:

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

因此,下一步,我想将related_eigenvectos转换为仅包含零和如上所述的零。 我可以通过残酷地搜索和替换值来实现。 但是,有没有更优雅的方法可以做到这一点?

具有两种元素的向量数组可以通过以下方式转换为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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM