Преобразование матрицы смежности в матрицу расстояний в питоне - PullRequest
0 голосов
/ 24 октября 2018

Я преобразовал следующий список ребер:

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 голосов
/ 24 октября 2018

Предполагая, что ваш список границ представлен следующим образом:

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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...