在python中将邻接矩阵转换为距离矩阵

时间:2018-10-24 13:38:14

标签: python hierarchical-clustering distance-matrix

我转换了以下边列表:

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_matrix中的scipy.spatial仅给出错误。

有没有一种方法可以以描述的方式反映距离权重来计算距离矩阵?主要要点是了解将邻接矩阵转换为距离矩阵以使其可用于scipy包的方法

1 个答案:

答案 0 :(得分: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
        }
    }
}