Как рассчитать глобальную эффективность графа в igraph (python)? - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь вычислить общую эффективность графа в igraph, но я не уверен, правильно ли я использую модуль.Я думаю, что есть решение, которое может иметь немного смысла, но оно есть в r, и я не смог расшифровать то, что они говорили.

Я пытался написать код в стиле networkx, пытаясьподражать способу, которым они вычисляют глобальную эффективность, но я был неудачным до сих пор.Я использую igraph из-за того, что имею дело с большими графами.Любая помощь будет принята с благодарностью: D

Это то, что я пробовал:

import igraph
import pandas as pd
import numpy as np
from itertools import permutations

datasafe = pd.read_csv("b1.csv", index_col=0)
D = datasafe.values
g = igraph.Graph.Adjacency((D > 0).tolist())
g.es['weight'] = D[D.nonzero()]

def efficiency_weighted(g):
    weights = g.es["weight"][:]
    eff = (1.0 / np.array(g.shortest_paths_dijkstra(weights=weights)))
    return eff

def global_efficiecny_weighted(g):
    n=180.0
    denom=n*(n-1)
    g_eff = sum(efficiency_weighted(g) for u, v in permutations(g, 2))
    return g_eff

global_efficiecny_weighted(g)

Сообщение об ошибке, которое я получаю, говорит: - TypeError: объект 'Graph' не повторяется

1 Ответ

1 голос
/ 17 июня 2019

Предполагая, что вам нужна узловая эффективность для всех узлов, вы можете сделать это:

import numpy as np
from igraph import *
np.seterr(divide='ignore')

# Example using a random graph with 20 nodes
g = Graph.Erdos_Renyi(20,0.5)

# Assign weights on the edges. Here 1s everywhere
g.es["weight"] = np.ones(g.ecount())

def nodal_eff(g):

    weights = g.es["weight"][:]
    sp = (1.0 / np.array(g.shortest_paths_dijkstra(weights=weights)))
    np.fill_diagonal(sp,0)
    N=sp.shape[0]
    ne= (1.0/(N-1)) * np.apply_along_axis(sum,0,sp)

    return ne

eff = nodal_eff(g)
print(eff)
#[0.68421053 0.81578947 0.73684211 0.76315789 0.76315789 0.71052632
# 0.81578947 0.81578947 0.81578947 0.73684211 0.71052632 0.68421053
# 0.71052632 0.81578947 0.84210526 0.76315789 0.68421053 0.68421053
# 0.78947368 0.76315789]

Чтобы получить глобальное значение, просто выполните:

np.mean(eff)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...