「R」におけるグラフクラスタリングのアプローチと例


10

「r」のグラフクラスタリングを使用して、グラフ内のノードをグループ化/マージしようとしています。

ここに私の問題の驚くほどおもちゃのバリエーションがあります。

  • 2つの「クラスター」があります。
  • クラスタを接続する「ブリッジ」があります

これが候補ネットワークです。
ここに画像の説明を入力してください

接続距離「ホップカウント」を確認すると、次のマトリックスが得られます。

 mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

ここでの考え:

  • 幸運なことに、またはおもちゃの単純さのために、マトリックスには明らかなパッチがありますが、これは(非常に大きい)マトリックスの場合には当てはまりません。ポイントと行の関係をランダム化した場合、それほどクリーンではありません。
  • 間違っている可能性があります。タイプミスがある場合はお知らせください。
  • ここでのホップ数は、行iのポイントを列jのポイントに接続するための最短ホップ数です。セルフホップはまだホップなので、対角線はすべて1です。

したがって、このマトリックスでは、距離(ホップ数)が大きいほど数値が大きくなります。距離ではなく「接続性」を示す行列が必要な場合は、行列の各セルをその乗法的逆行列で置き換えるドット逆行列を実行できます。

質問:

私自身の方法を見つけるのを助けるために:

  • それらを組み合わせることによりグラフ上のノードの数を減らすための用語は何ですか?それはクラスタリング、マージ、マンギングですか?私が使うべき言葉は何ですか?
  • 実証済みのテクニックは何ですか?このトピックに関する教科書はありますか?あなたは論文やウェブサイトを指すことができますか?
  • 今、私は最初にここを見てみました-それは素晴らしい「最初のチェック」スポットです。探していたものが見つかりませんでした。見逃した場合(ありそうもないことですが)、CVのトピックに関する1つまたは2つの回答済みの質問を教えていただけますか?

私が行くところに連れて行くには:

  • ネットワーク上のノードを適切にクラスター化する「R」パッケージはありますか?
  • これを行うためのサンプルコードを教えてもらえますか?
  • 結果の削減されたネットワークをグラフィカルに表示する「R」パッケージはありますか?
  • これを行うためのサンプルコードを教えてもらえますか?

前もって感謝します。


2
(R)パッケージまたはコードの要求はここではトピックから外れていることに注意してください。「検索」部分を目立たせ、「取得」部分を目立たなくしたい場合があります。
gung-モニカの回復

3
@gungの機会があったら、いつか完全な答えを出そうとします。しかし、ここで簡単に答えると、R igraphパッケージを使用してEngrStudentのサンプルグラフに適用されるコミュニティ検出があります。
アンディW

1
私見では、このグラフにはクラスターが1つしかありません。ただし、3つのクリークが重なっています。なぜあなたの計画が真ん中のクリークを破壊するのかわからない-これを形式化できなければ、アルゴリズムを見つけるのに苦労するだろう。
QUITあり-2015年

2
価値のあるものとして、mcl(micans.org/mcl)は2つのクラスターを見つけます(私はAnony-Mousseの評価に本当に同意しません。また、グラフのクラスタリングに対するクリークモデリングアプローチは特に実りがありません)。これは、単一のパラメーター(粒度を制御する)がデフォルトに設定されています。このアルゴリズム(mcl-私が公開しました)は、バイオインフォマティクスで非常に広く使用されており、(非常にスケーラブルな)ソースコードを利用できます。Rとのインターフェースは、テキストインターフェイスを使用して簡単に実行できます。
micans 2015

2
コードとパッケージを要求することは、ここでは本質的に常に話題から外れています。Stack Overflowでは、既存のコード(つまり、再現可能な例がある)でヘルプを求めるのがトピックです。あなたがこれを知らなかったなら、それはそれを学ぶ時が来ました。SOのR Qに答えるユーザーに統計の専門知識がないという考えは私には奇妙ですが、多くの人々はそれを想定しているようです。とにかくそれは真実ではありません。あなたのQがSOの投稿で回答されたことは、ここで何か言うべきです。OTOHは、「これはどのような分析なのか、誰かが私にリソースを指摘することができますか」と言っているのは間違いなくここのトピックです。
ガン-モニカの復活

回答:


9

あなたの特定の例は、コミュニティ内のノード間の接続が多く、異なるコミュニティ内のノード間のエッジが比較的少ないネットワーク内のコミュニティを見つけることを提案しています。これは、完全に切り離されたサブグラフが存在する孤立したコミュニティを見つけることとは異なります。

これは、igraphパッケージとClauset et al。で説明されているアルゴリズムを使用したRでのコミュニティ検出の例です(2004)。このアルゴリズムを使用するには、「ホップカウント」をセルフループのないバイナリ隣接行列に変換します。アルゴリズムには無向行列が必要です。無向行列は、手書きの図や指定したデータと一致します(エッジは対称です)。

library(igraph)
mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

#turn this into an adjacency matrix
adjMat <- mymatrix == 1
diag(adjMat) <- 0 #no self loops

g  <- graph.adjacency(adjMat)
plot(g)

#only works for undirected graphs, which this example is fine since symetric
fc <- fastgreedy.community(as.undirected(g))

#make colors for different communities
V(g)$color <- ifelse(membership(fc)==1,"red","blue")
plot(g)

ここに画像の説明を入力してください

このようなノードをさらに分析するために折りたたむことの妥当性についてコメントすることはできませんが、そのようなコミュニティの検出は、ネットワークを探索するのに間違いなく役立ちます。他にもコミュニティ検出アルゴリズムはたくさんあります(Rでのネットワーク分析用の他のライブラリも同様です)。これは、このおもちゃの問題で必要な出力を生成するための1つの例にすぎません。


1
また、グラフデータベースの使用に関する以前のコメントを考えると、グラフを隣接行列として表す必要はありません。ノードのテーブルと各エッジの行は、より一般的で効率的な形式であり、これをigraphネットワークに変換できます。
アンディW

1

ノードと接続データのリポジトリーにまだ慣れていない場合は、Rneo4jパッケージを確認できます。ただし、これはデータを格納するためにneo4j(RDBMSではなくグラフデータベース)を使用することを意味します。私はここの専門家ではありませんが、このアプローチは、a)Anony-Mousseによって提案されているように、これを形式化できない場合、またはb)ノードと接続の数が特に多い場合、またはc)巻き込む場合に特に効果的であると思いますネットワークに関する追加の質問があります。


そんなものが存在するなんて知らなかった。きちんと!これは素材の適切な例ですか?nicolewhite.github.io/RNeo4j/examples
EngrStudent

どのようにして、neo4jのデータからグラフクラスタリングに移行しますか?mclまたはigraphはそれで動作しますか?
EngrStudent 2015年

2
データをneo4jからRにプルしたら、データに対して他のRパッケージ(たとえば、AndyWがigraphを提案)を使用できます。または、Rneo4jパッケージには、データを取得するためのコマンドが含まれており、Cypherクエリ言語(SQLに類似していますが、neo4jグラフデータベース用にカスタムビルドされています)を実行できます。Cypherでは、高度なクエリを実行し、いくつかの事前定義されたアルゴリズムを実行できます(最短パス、すべてのパス、すべての単純パス、ダイクストラなど)。私はキャラクターとコンテンツの両方で私の限界にいます-この道を進みたければ(申し訳ありません!)、neo4jサイトがあなたの次の目的地かもしれません。
user3123116 2015

1

今後の読者のために、

以下はigraphパッケージの関数のセットで、最後の関数はMCLのものです。

print("LABEL PROPAGATION")
w<-cluster_label_prop(g)

print("Leading Eigen")
w<-cluster_leading_eigen(g)

print("SpinGlass")
w<-cluster_spinglass(g, stop.temp = 0.05)

print("walktrap")
w<-cluster_walktrap(g, steps=4)

print("MCL")
adj<-get.adjacency(g)
w<-mcl(adj,addLoops=TRUE)

ドキュメントはこちらhttp://igraph.org/r/doc/とこちらhttps://cran.r-project.org/web/packages/MCL/MCL.pdf

私はウォークトラップが特に便利だと思います


これは質問に関連している可能性がありますが、回答のようには思えません。
Michael R. Chernick 2018年

2
私は2つの質問に答えました:ネットワーク上のノードを適切にクラスター化する 'R'パッケージはありますか?これを行うためのサンプルコードを教えてもらえますか?しかし、はい、それはすべての質問に答えるものではありません。
Omar Jaafor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.