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

标签 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),我的核心问题是将上面的边缘列表转换为距离矩阵,该包将知道如何正确读取。距离应该越小,联系的权重就越高(反之亦然),但是 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/

相关文章:

python - 通过将两个字典的值合并到排序列表中来组合两个字典

python - easy_install 在哪里安装东西?

r - R中不同范围/尺度的连续异质变量的层次聚类

python - 将颜色条添加到集群热图

apache-spark - 如何计算 Spark 中的距离矩阵?

python - 绕过 python 列表中的内存错误问题或 Numpy 中更聪明的方法

r - 如何创建包含每行之间的平均绝对分数的距离矩阵?

python - 找到超过特定阈值的概率

python - 是否可以将 Pandas groupby 函数与非不相交的组一起使用?

具有缺失值的Python层次聚类