Как рассчитать коэффициент кластеризации каждого узла в графе в Python с помощью Networkx - PullRequest
0 голосов
/ 21 сентября 2019

Я хочу рассчитать коэффициент кластеризации каждого узла в графе, используя функции Python и Networkx.Я знаю, что для этой цели может быть встроенная функция, но я хочу вычислить ее самостоятельно, но мой код не работает.Может кто-нибудь указать на ошибку?

Я попытался проверить и отладить код.Число соседей каждого узла, т.е. n_neighbors рассчитаны, кажется, все в порядке, но следующий код почему-то не работает или имеет какую-то ошибку, которую я не могу обнаружить.

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

for node in network.nodes():
    neighbours=nx.neighbors(network,node)
    count=0
    for n in neighbours:
        count+=1
    n_neighbors=count
    n_links=0
    if n_neighbors>1:
        for node1 in neighbours:
            for node2 in neighbours:
                if nx.has_edge(node1,node2):
                    n_links+=1
                    n_links/+2 #because n_links is calculated twice
        clustering_coefficient=n_links/(0.5*n_neighbors*(n_neighbors-1))
        print(clustering_coefficient)
    else:
        print(0)

1 Ответ

1 голос
/ 22 сентября 2019

Вы должны заметить, что соседей является итератором.Это означает, что после первой итерации у вас больше нет элементов для их итерации.При входе в строку for node1 in neighbors: соседей пусто, и вы никогда не достигнете внутренней части цикла.Обратитесь к документации по функции здесь

Кроме того, обратите внимание, что n_links/+2 не меняет значение n_links.Это должно быть n_links/=2.

nx.has_edge(node1,node2) должно работать на графике.

Что касается логики - вы должны переместить линию, где вы делите на 2. Вы должны вычислить ее после того, как вы закончиливычисляя все связи между соседями, или просто добавляйте 0,5 каждый раз, когда вы найдете ребро.

После изменения этих вещей вы получите:

for node in network.nodes():
    neighbours=[n for n in nx.neighbors(network,node)]
    n_neighbors=len(neighbours)
    n_links=0
    if n_neighbors>1:
        for node1 in neighbours:
            for node2 in neighbours:
                if network.has_edge(node1,node2):
                    n_links+=1
        n_links/=2 #because n_links is calculated twice
        clustering_coefficient=n_links/(0.5*n_neighbors*(n_neighbors-1))
        print(clustering_coefficient)
    else:
        print(0)
...