1

2 種類のノードを持つネットワークの Adamic-Adar 類似度を計算しようとしています。私は、発信接続を持つノード間の類似性を計算することにのみ関心があります。着信接続を持つノードは一種のコネクタであり、私はそれらに興味がありません。

データサイズと特徴:

> summary(g)
IGRAPH DNW- 3852 24478 -- 
+ attr: name (v/c), weight (e/n)

Python 2.7 のプロトタイプ コード:

import glob
import os
import pandas as pd
from igraph import *

os.chdir("data/")
for file in glob.glob("*.graphml"):
    print(file)
    g = Graph.Read_GraphML(file)
    indegree = Graph.degree(g, mode="in")

    g['indegree'] = indegree
    dev = g.vs.select(indegree == 0)

    m = Graph.similarity_inverse_log_weighted(dev.subgraph())

    df = pd.melt(m)

    df.to_csv(file.split("_only.graphml")[0] + "_similarity.csv", sep=',')

このコードには何か問題があります。dev長さ1は でありm0.0期待どおりに動作しないためです。

ヒント

私はR で動作するコードを持っていますが、それを Python に書き直すことができないようです (これはパフォーマンスのために行っています。ネットワークは巨大です)。ここにあります:

   # make sure g is your network
   indegree <- degree(g, mode="in")
   V(g)$indegree <- indegree
   dev <- V(g)[indegree==0]
   m <- similarity.invlogweighted(g, dev)
   x.m <- melt(m)
   colnames(x.m) <- c("dev1", "dev2", "value")
   x.m <- x.m[x.m$value > 0, ]

   write.csv(x.m, file = sub(".csv",
                             "_similarity.csv", filename))
4

1 に答える 1

1

度数を頂点属性としてではなくグラフ属性として割り当てているため、後で合理的に呼び出すことはできません。代わりにこれが必要です:g.vs.select()

indegree = g.degree(mode="in")
g.vs["indegree"] = indegree
dev = g.vs.select(indegree=0)

しかし、実際には、次のように簡単に書くことができます。

dev = g.vs.select(_indegree=0)

これは、selectメソッドがどのように機能するかによって機能します。

キーワード引数から推測される属性名は、アンダースコア ( ) で始まる場合、特別に扱われます_。これらは実際の属性ではなく、頂点の特定のプロパティ (次数など) を参照します。ルールは次のとおりです。属性名がアンダースコアで始まる場合、残りの名前は Graph オブジェクトのメソッドとして解釈されます。このメソッドは頂点シーケンスを最初の引数として呼び出され (その他はすべてデフォルト値のまま)、メソッドによって返された値に従って頂点がフィルター処理されます。

于 2015-08-30T12:29:58.737 に答える