【问题标题】:Converting adjacency matrix into distance matrix in python在python中将邻接矩阵转换为距离矩阵
【发布时间】:2018-10-24 13:38:14
【问题描述】:

我转换了以下边缘列表:

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 只会出错。

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

【问题讨论】:

  • 边列表如何表示?现在是在列表还是平面文件中?

标签: python hierarchical-clustering distance-matrix


【解决方案1】:

假设你的边缘列表是这样表示的:

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
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多