1. ホーム
  2. python

[解決済み] 隣接ノードの属性に応じたネットワークXの平均隣接度を算出する。

2022-02-24 07:30:34

質問内容

私のグラフでは、ノードには属性があり、ノードのタイプは1か2であることがわかります。

G=nx.Graph()
G.add_node('N1',n_type=1)
G.add_node('N2',n_type=1)
G.add_node('N3',n_type=2)
G.add_edges_from([('N3','N1'),('N3','N2')])

NetworkXのnx.average_neighbor_degree(G)関数を使うと、以下のような結果が得られます。

{'N1': 2.0, 'N2': 2.0, 'N3': 1.0}

しかし、1種類のノードだけを考慮した平均近傍度を求めたい。例えば、属性が1の場合の平均近傍度は以下のようになるはずである。

{'N1': 0.0, 'N2': 0.0, 'N3': 1.0}

これは、ノードN3が属性n_type=1の隣人を持つ唯一のノードであり、その隣人の平均はDegree(N1)+Degree(N2)/2 = 1+1/2 = 1であることから

何か提案はありますか?

解決方法は?

ソースコードを確認し、少し手を加えて、このようにすることができました。参考になれば幸いです。

import networkx as nx

def get_average_nbr_deg_by_type(G, node_type):
    avg = {}
    for n, deg in G.degree:
        nbrs_deg = [d for n, d in G.degree(G[n]) if G.nodes[n]['n_type'] == node_type]
        deg = len(nbrs_deg)
        if deg == 0:
            deg = 1
        avg[n] = sum(nbrs_deg) / float(deg)

    return avg

get_average_nbr_deg_by_type(G, node_type=1)
# outputs {'N1': 0.0, 'N2': 0.0, 'N3': 1.0}