Upgrade to Pro — share decks privately, control downloads, hide ads and more …

データマイニング - コミュニティ発見

データマイニング - コミュニティ発見

1. グラフ分割
2. リンクコミュニティ

Avatar for Y. Yamamoto

Y. Yamamoto

July 04, 2025
Tweet

More Decks by Y. Yamamoto

Other Decks in Science

Transcript

  1. グラフの連結成分 (connected components) 無向グラフの部分グラフのうち、極大で連結しているもの → 要するに孤⽴している部分グラフ 連結成分 A 連結成分 B

    連結成分 C 連結成分 D # NetworkXで連結成分を抽出する nx.connected_components(G) 連結成分は孤⽴した部分グラフしか発⾒できない…
  2. 再訪)ノードの媒介中⼼性 3 6 5 4 1 2 0 注目ノードがそれ以外のノード間の経路に 含まれる割合を示す指標

    → ノードがどの程度「経路上の要所」になっているか? 媒介中⼼性= 9 15 媒介中⼼性= 0 15 媒介中⼼性= 8 15
  3. エッジの媒介中⼼性(≠ ノードの媒介中⼼性) エッジに対しても媒介中心性を定義できる 3 6 5 4 1 2 0

    → 注⽬エッジがそれ以外のエッジ間の最短経路に含まれる割合 このエッジはそれ以外の エッジ間にどの程度 含まれる? ノードとエッジをひっくり返して媒介中心性を計算するイメージ
  4. 3 6 5 4 1 2 0 エッジの媒介中⼼性(≠ ノードの媒介中⼼性) エッジに対しても媒介中心性を定義できる

    このエッジはそれ以外の エッジ間にどの程度 含まれる? 5-6 4-6 4-5 3-4 2-3 1-2 0-1 0-2 5 6 4 4 3 2 2 1 0 → 注⽬エッジがそれ以外のエッジ間の最短経路に含まれる割合
  5. エッジの媒介中⼼性(≠ ノードの媒介中⼼性) エッジに対しても媒介中心性を定義できる 3 6 5 4 1 2 0

    エッジ媒介中⼼性 = 0.57 0.05 0.24 0.24 0.24 0.24 0.05 0.57 → 注⽬エッジがそれ以外のエッジ間の最短経路に含まれる割合
  6. エッジの媒介中⼼性(≠ ノードの媒介中⼼性) エッジに対しても媒介中心性を定義できる 3 6 5 4 1 2 0

    エッジ媒介中⼼性 = 0.57 0.05 0.24 0.24 0.24 0.24 0.05 0.57 # NetworkXでエッジ媒介中⼼性を計算 nx.edge_betweenness_centrality(G) → 注⽬エッジがそれ以外のエッジ間の最短経路に含まれる割合
  7. エッジの媒介中⼼性を⽤いたグラフ分割 3 6 5 4 1 2 0 0.05 0.24

    0.24 0.24 0.24 0.05 0.57 0.57 エッジ媒介中心性の大きい順にエッジをカット (適当なところまで処理を続ける)
  8. エッジの媒介中⼼性を⽤いたグラフ分割 エッジ媒介中心性の大きい順にエッジをカット 3 6 5 4 1 2 0 (適当なところまで処理を続ける)

    0.05 0.24 0.24 0.24 0.24 0.05 0.57 0.57 コミュニティA コミュニティB 適当なコミュニティ数 or 適度な分割状態
  9. エッジの媒介中⼼性を⽤いたグラフ分割の例(2/7) 0.53 0.37 0.37 0.37 0.29 0.11 0.11 0.11 0.11

    0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 媒介中⼼性を計算 分割 1 回⽬
  10. エッジの媒介中⼼性を⽤いたグラフ分割の例(4/7) 0.13 0.13 0.13 0.12 0.05 0.05 0.05 0.05 0.05

    0.05 0.05 0.05 0.05 0.05 0.05 0.05 媒介中⼼性を計算 分割 2 回⽬
  11. エッジの媒介中⼼性を⽤いたグラフ分割 エッジ媒介中心性の大きい順にエッジをカット 3 6 5 4 1 2 0 (適当なところまで処理を続ける)

    0.05 0.24 0.24 0.24 0.24 0.05 0.57 0.57 コミュニティA コミュニティB 適当なコミュニティ数 or 適度な分割状態 分割の適切性をどう評価するか?
  12. モジュラリティ(1/3) 0 1 1 0 0 0 1 0 1

    1 0 0 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 エッジがコミュニティ内部に集中している割合を示す指標 0 1 2 3 4 5 隣接⾏列 A B ノード数 = 6, エッジ数 = 7 コミュニティA内のノードから A内ノードへ出るエッジの有無 コミュニティB内のノードから B内ノードへ出るエッジの有無
  13. モジュラリティ(2/3) 6 1 1 6 0 1 2 3 4

    5 B→Bへ出る エッジの数 B→Aへ出る エッジの数 A B コミュニティ内外に出⼊りする エッジ数を⽰す⾏列 ノード数 = 6, エッジ数 = 7 A→Aへ出る エッジの数 A→Bへ出る エッジの数 エッジがコミュニティ内部に集中している割合を示す指標
  14. モジュラリティ(3/3) 6 1 1 6 エッジがコミュニティ内部に集中している割合を示す指標 0 1 2 3

    4 5 コミュニティ内外に出⼊りする エッジ数を⽰す⾏列 A内のノードから 出るエッジの数 = 合計7 A B Aのノードに ⼊るエッジの数 =合計7 ノード数 = 6, エッジ数 = 7
  15. ? ? ? ? 2列⽬の合計 7 1番⽬の⾏の合計 7 7 ランダムにエッジが張られた場合のエッジ数は?

    (コミュニティ内外に出⼊りするエッジの総数は固定) 合計 14 7 × 7 14 2番⽬の⾏の合計 1列⽬の合計 7 ランダムに作られたコミュニティの内外に出⼊りするエッジ数の期待値
  16. ? ? ? ? 7 × 7 14 7 ×

    7 14 7 × 7 14 7 × 7 14 ランダムにエッジが張られた場合のエッジ数は? (コミュニティ内外に出⼊りするエッジの総数は固定) 2列⽬の合計 7 1番⽬の⾏の合計 7 7 合計 14 2番⽬の⾏の合計 1列⽬の合計 7 ランダムに作られたコミュニティの内外に出⼊りするエッジ数の期待値
  17. モジュラリティの概念 ノード数 = 6, エッジ数 = 7 6 1 1

    6 エッジがコミュニティ内部に集中している割合を示す指標 0 1 2 3 4 5 コミュニティ内外に出⼊りする エッジ数を⽰す⾏列 A B 3.5 3.5 3.5 3.5 ランダムの場合 ズレを⾒る ズレが大きいほど密なコミュニティの存在を示唆
  18. モジュラリティの定義 6 1 1 6 A = コミュニティ隣接⾏列 合計 7

    ⾏の和 エッジがコミュニティ内部に集中している割合を示す指標 𝑄 = 1 2𝑚 & !"# $ (𝐴!,! − ∑& 𝐴!,& 2𝑚 & & 𝐴&,! )
  19. モジュラリティの定義 6 1 1 6 A = コミュニティ隣接⾏列 合計 7

    列の和 エッジがコミュニティ内部に集中している割合を示す指標 𝑄 = 1 2𝑚 & !"# $ (𝐴!,! − ∑& 𝐴!,& 2𝑚 & & 𝐴&,! )
  20. エッジがコミュニティ内部に集中している割合を示す指標 𝑄 = 1 2𝑚 & !"# $ (𝐴!,! −

    ∑& 𝐴!,& 2𝑚 & & 𝐴&,! ) = 1 2𝑚 & !"# $ コミュニティi 内のエッジ数 コミュニティi 内の エッジ数の期待値 ー 正規化係数(有向エッジ数を割合に) 1に近づくほどコミュニティ内部にエッジが集中 ランダムに⽣成した モジュラリティの定義
  21. モジュラリティの計算例(1/2) ノード数 = 6, エッジ数 = 7 0 1 2

    3 4 5 A B 1 2𝑚 ( !"# $ コミュニティi 内のエッジ数 コミュニティi 内の エッジ数の期待値 ー = 1 2×7 6 − 3.5 + (6 − 3.5) = 1 2×7 (2.5 + 2.5) = 0.357 # コミュニティを定義 communities = [{0,1,2}, {3,4,5}] # モジュラリティの計算 nx.community.modularity(G, communities) ランダムに⽣成した
  22. モジュラリティの計算例(2/2) 0 1 2 3 4 5 A B 0

    1 2 3 4 5 A B 𝑄 = 0.357 𝑄 = 0.122 > 適切な 分割
  23. Girvan-Newman アルゴリズム 以下の手順でグラフを分割し、コミュニティを発見する 1. グラフ中の全エッジのエッジ媒介中⼼性を計算 2. 最⼤のエッジ媒介中⼼性をもつエッジを削除 3. 連結成分の数 or

    モジュラリティ値が⼀定値を 超えるまで、ステップ1-2を繰り返す 4. 得られた各連結成分をコミュニティとする モジュラリティの計算はエッジ削除前のグラフで計算すること!!
  24. Girvan-Newman法 using NetworkX # グラフGに対してGirvan-Newman法を適⽤ for i, communities in enumerate(nx.community.girvan_newman(G))

    # ループを回すごとにエッジを削除し,コミュニティを抽出 print(f“{i+1}回⽬の分割結果”, communities) 3 6 5 4 1 2 0 1回目の分割結果 ({0, 1, 2}, {3, 4, 5, 6}) 2回目の分割結果 ({0, 1, 2}, {4, 5, 6}, {3}) 3回目の分割結果 ({0}, {1, 2}, {4, 5, 6}, {3}) 4回目の分割結果 ({0}, {1}, {2}, {4, 5, 6}, {3}) 5回目の分割結果 ({0}, {1}, {2}, {4}, {5, 6}, {3}) 6回目の分割結果 ({0}, {1}, {2}, {4}, {5}, {6}, {3}) 所望の分割粒度で停止させる必要アリ
  25. エッジの類似度 5 6 7 1 2 3 4 8 𝑠𝑖𝑚)*+,

    𝑒*, , 𝑒-, = |𝑛. 𝑖 ∩ 𝑛. (𝑗)| |𝑛. 𝑖 ∪ 𝑛. (𝑗)| 片端のノードを共有するエッジの類似度を以下で定義 ノードiとkを 両端とするエッジ ノードjおよびそれと 隣接するノードの集合 似てる? 両端とも共通するノードがなければ類似度はゼロとする
  26. エッジの類似度 5 6 7 1 2 3 4 8 𝑠𝑖𝑚)*+,

    𝑒/,1 , 𝑒2,1 = |𝑛. 8 ∩ 𝑛. (1)| |𝑛. 8 ∪ 𝑛. (1)| 片端のノードを共有するエッジの類似度を以下で定義
  27. エッジの類似度 5 6 7 1 2 3 4 8 𝑠𝑖𝑚)*+,

    𝑒/,1 , 𝑒2,1 = |𝑛. 8 ∩ 𝑛. (1)| |𝑛. 8 ∪ 𝑛. (1)| 片端のノードを共有するエッジの類似度を以下で定義
  28. エッジの類似度 5 6 7 1 2 3 4 8 𝑠𝑖𝑚)*+,

    𝑒/,1 , 𝑒2,1 = |𝑛. 8 ∩ 𝑛. (1)| |𝑛. 8 ∪ 𝑛. (1)| = 4 6 片端のノードを共有するエッジの類似度を以下で定義 エッジ類似度は共有しているノードが一致すると最大に
  29. 回 実施日 トピック 9 06/13 グラフデータ 10 06/20 グラフ構造の諸指標 11

    06/27 ノードの中心性 12 07/04 コミュニティ発見 13 07/11 ウェブとグラフ 14 07/18 グラフ埋め込み 15 07/25 総合演習 – 社会ネットワーク分析 授業計画 54