You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用NetworkX基于相似度邻接矩阵为已创建图添加带相似度属性的边?

基于余弦相似度邻接矩阵为NetworkX图添加带属性的边

嗨,我来帮你搞定这个问题!你已经完成了带属性节点图的创建,也算出了节点间的余弦相似度邻接矩阵,接下来只需要遍历这个矩阵,把对应的边和相似度属性添加到NetworkX图里就行,具体实现方法如下:

核心实现思路

因为你用的是无向图(nx.Graph()),节点对(u, v)(v, u)属于同一条边,为了避免重复添加边浪费资源,我们可以只遍历不重复的节点对,再从邻接矩阵中取出对应的相似度值,作为边的属性添加到图中。

具体代码实现

推荐用itertools.combinations生成所有无序的不重复节点对,这种方式效率最高:

import itertools

# 遍历所有不重复的节点对(仅生成u < v的组合,避免重复)
for u, v in itertools.combinations(adj_mat.index, 2):
    # 从邻接矩阵中获取u和v之间的余弦相似度
    similarity_value = adj_mat.loc[u, v]
    # 向图中添加边,并设置similarity属性
    G.add_edge(u, v, similarity=similarity_value)

验证结果

添加完成后,你可以通过以下代码查看某条边的属性,比如验证节点1和节点2的相似度:

print(G.edges[1, 2]['similarity'])

可选:过滤低相似度边

如果图的节点数量较多,不想保留所有相似度的边,可以设置一个阈值,只添加相似度高于阈值的边,比如只保留相似度>0.5的边:

similarity_threshold = 0.5

for u, v in itertools.combinations(adj_mat.index, 2):
    similarity_value = adj_mat.loc[u, v]
    if similarity_value > similarity_threshold:
        G.add_edge(u, v, similarity=similarity_value)

另一种遍历方式(适合小图)

如果你的节点数量很少,也可以用双重循环遍历所有节点对(注意跳过节点自身的连接):

for u in adj_mat.index:
    for v in adj_mat.columns:
        if u != v:
            similarity_value = adj_mat.loc[u, v]
            G.add_edge(u, v, similarity=similarity_value)

不过这种方式会重复处理(u, v)(v, u),虽然NetworkX会自动忽略重复的边,但效率不如第一种方法,所以更推荐用itertools.combinations的方式。

内容的提问来源于stack exchange,提问作者SteveS

火山引擎 最新活动