我转换了以下边缘列表:
Source Target Weight
A B 12
A C 14
A D 56
B C 17
B F 14
B G 10
到以下邻接矩阵:
{'A': {'B': {'weight': 12},
'C': {'weight': 14},
'D': {'weight': 56},
...
'B': {'C': {'weight': 17},
'F': {'weight': 14},
'G': {'weight': 10},
...
其中源列是投资的发送者,目标列是投资的接收者;权重栏是投资额。我想在这个加权网络上进行层次聚类,找出哪些参与者可以根据他们的相互投资聚集在一起(相互投资越高,参与者越“接近”)。
我正在使用 SciPy 的分层聚类包(scipy.cluster.hierarchy
),我的核心问题是将上面的边缘列表转换为距离矩阵,该包将知道如何正确读取。距离应该越小,联系的权重就越高(反之亦然),但是 scipy.spatial
中的 distance_matrix
在使用上述数据帧时仅给出错误作为输入。
是否有一种方法可以以所描述的方式反射(reflect)边权重的方式计算距离矩阵?要点只是了解将邻接矩阵转换为距离矩阵的方法,以使其可用于 scipy 包
最佳答案
假设您的边缘列表表示如下:
ls = [ ['Source', 'Target', 'Weight'],
['A', 'B', 12],
['A', 'C', 14],
['A', 'D', 56],
['B', 'C', 17],
['B', 'F', 14],
['B', 'G', 10]
]
您可以像这样有意构建图表:
graph = {}
for connection in ls[1:]:
source, sink, weight = connection[0], connection[1], connection[2]
if source not in graph:
graph[source] = {}
if sink not in graph[source]:
graph[source][sink] = {}
graph[source][sink]['weight'] = weight
打印图表:
{
"A": {
"B": {
"weight": 12
},
"C": {
"weight": 14
},
"D": {
"weight": 56
}
},
"B": {
"C": {
"weight": 17
},
"F": {
"weight": 14
},
"G": {
"weight": 10
}
}
}
关于python - 在python中将邻接矩阵转换为距离矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52970482/