1

我转换了以下边缘列表:

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),我的核心问题是将上面的边缘列表转换为包将知道如何正确读取的距离矩阵。距离应该更小,关系的权重越高(反之亦然),但是 当使用上述数据帧作为输入时, distance_matrixfrom只会给出错误。scipy.spatial

有没有办法以所描述的方式反映边缘权重的方式计算距离矩阵?要点只是要知道将邻接矩阵转换为距离矩阵以使其可用于 scipy 包的方法

4

1 回答 1

0

假设您的边缘列表表示为:

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
        }
    }
}
于 2018-10-24T15:16:10.103 回答