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

データマイニング - グラフデータと経路

データマイニング - グラフデータと経路

1. グラフとは
2. 経路

Avatar for Y. Yamamoto

Y. Yamamoto

June 13, 2025
Tweet

More Decks by Y. Yamamoto

Other Decks in Science

Transcript

  1. グラフデータの例(4/5) - 購買・出版 ユーザA ユーザB い ろ は に ほ

    出版社X 出版社Y 出版社Z 出版 出版 出版 購⼊ 購⼊ 購⼊
  2. グラフの数学的な定義の例 G = (V, E) V = {1, 2, 3,

    4, 5, 6} E = {(1, 2), (2, 3), (4, 3), (3, 5), (4, 6), (5, 6)} ノード集合→ エッジ集合→ 2 3 4 1 5 6
  3. 有向グラフと無向グラフ 2 3 4 1 5 6 有向グラフ エッジに⽅向性がある 2

    3 4 1 5 6 無向グラフ エッジに⽅向性がない (双⽅向に関係があるとも⾔える)
  4. 重み付きグラフ 名古屋 京都 ⼤阪 ⾦沢 東京 40分 90分 150分 100分

    25分 グラフはエッジに重みを設定することが可能 例: 移動コスト, 関係の強さ 本講義では断りがない限り,枝の重みは考えない
  5. グラフの定義 on NetworkX import networkx as nx V = [0,

    1, 2, 3, 4] E = [ (0, 1), (1, 0), (1, 2), (2, 4), (3, 1), (4, 2), (4, 3)] ← ノードの定義 ← エッジの定義 2 4 3 1 0
  6. グラフの定義 on NetworkX import networkx as nx V = [0,

    1, 2, 3, 4] E = [ (0, 1), (1, 0), (1, 2), (2, 4), (3, 1), (4, 2), (4, 3)] G = nx.DiGraph() G.add_nodes_from(V) G.add_edges_from(E) ← 空の有向グラフを⽤意 ← ノード, エッジの追加 2 4 3 1 0
  7. グラフの定義 on NetworkX import networkx as nx V = [0,

    1, 2, 3, 4] E = [ (0, 1), (1, 0), (1, 2), (2, 4), (3, 1), (4, 2), (4, 3)] G = nx.DiGraph() G.add_nodes_from(V) G.add_edges_from(E) nx.draw(G) ← グラフの可視化 2 4 3 1 0
  8. 無向グラフの定義 on NetworkX import networkx as nx V = [0,

    1, 2, 3, 4] E = [ (0, 1), (1, 0), (1, 2), (2, 4), (3, 1), (4, 2), (4, 3)] G = nx.Graph() G.add_nodes_from(V) G.add_edges_from(E) nx.draw(G) 2 4 3 1 0 ← 無向グラフはDiGraphではなくGraph
  9. ノード,エッジの確認 on NetworkX V = G.nodes() 2 4 3 1

    0 ← グラフGのノード集合にアクセス E = G.edges() ← グラフGのノード集合にアクセス for e in E: print(e) ← エッジ集合をひとつずつ確認
  10. 隣接⾏列 (Adjacency Matrix ) (2/4) 2 4 3 1 0

    𝐴 = 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 重みなしグラフの場合 隣接⾏列のa⾏b列の要素が1 → a番⽬のノードからb番⽬の要素へのエッジが存在する 隣接⾏列のa⾏b列の要素が0 → a番⽬のノードからb番⽬の要素へのエッジが存在しない 0⾏⽬ 1列⽬ ノード0から ノード1へのエッジが存在
  11. 隣接⾏列 (Adjacency Matrix ) (3/4) 2 4 3 1 0

    𝐴 = 0 1 0 0 0 1 0 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 重みなしグラフの場合 隣接⾏列のa⾏b列の要素が1 → a番⽬のノードからb番⽬の要素へのエッジが存在する 隣接⾏列のa⾏b列の要素が0 → a番⽬のノードからb番⽬の要素へのエッジが存在しない 無向グラフの場合,隣接行列は対称行列になる
  12. 隣接⾏列 (Adjacency Matrix ) (4/4) 𝐴 = 0 1 0

    0 0 1 0 3 0 0 0 0 0 0 0.5 0 8 0 0 0 0 0 2 0.5 0 重み付きグラフの場合 a番⽬のノードからb番⽬の要素へのエッジが存在する場合 → 隣接⾏列のa⾏b列の要素の値は重みの値 a番⽬のノードからb番⽬の要素へのエッジが存在しない場合 → 隣接⾏列のa⾏b列の要素の値はゼロ 2 4 3 1 0 1 3 0.5 0.5 2 8
  13. 隣接⾏列の取得 on NetworkX 2 4 3 1 0 import networkx

    as nx V = [0, 1, 2, 3, 4] E = [ (0, 1), (1, 2), (2, 4), (3, 1), (4, 3)] G = nx.Graph() G.add_nodes_from(V) G.add_edges_from(E) A = nx.adjacency_matrix(G).toarray() NumPy形式に変換 neighbors_from_1 = list(G.neighbors(1)) ノード1の隣接ノード
  14. 経路 2 4 3 1 0 § グラフ上のエッジをたどって,あるノードから 別ノードに移動する際に通るノードの系列 §

    ノード間の経路が複数ある場合もある ノード4からノード2への経路 (4, 2) (4, 3, 1, 2) …
  15. 到達可能性 ノード nx からノード ny への経路が存在するとき nx から ny へ到達可能という

    ノード0からノード3へは 到達可能 ノード3からノード0へは 到達不可能 2 4 3 1 0
  16. 隣接⾏列と到達可能性(1/4) 2 4 3 1 0 𝐴 = 0 1

    0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 重みなし行列の場合,隣接行列のべき乗を 計算することで到達可能性を調べられる
  17. 隣接⾏列と到達可能性(2/4) 2 4 3 1 0 𝐴2 = 0 1

    0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 ノード0が接続しているノード ノード2に 接続しているノード
  18. 隣接⾏列と到達可能性(3/4) 2 4 3 1 0 𝐴2 = 0 0

    1 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 ノード0から2ホップで 到達できるノード
  19. 隣接⾏列と到達可能性(4/4) 2 4 3 1 0 𝐴3 = 0 0

    0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 2 1 0 ノード4から3ホップで 到達できるノード ノード4からノード2へは 経路が2つあることを意味
  20. 距離 ノード nx からノード ny への最短経路の長さ (or エッジの重み合計)を距離と呼ぶ 2 4

    3 1 0 ノード4からノード2へは 最短経路は(4, 2) ノード4からノード2への 距離は1
  21. 距離⾏列 グラフに属する全ノード間の距離を表記した行列 2 4 3 1 0 𝐷 = 0

    1 2 4 3 ∞ 0 1 3 2 ∞ 3 0 2 1 ∞ 1 2 0 3 ∞ 2 1 1 0 たどり着けない ノードの距離は∞ ノード1から ノード3への距離は3
  22. 最短経路アルゴリズム on NetworkX shortest_paths = dict( nx.single_source_all_shortest_paths(G, 3) ) all_shortest_paths

    = dict( nx.all_pairs_shortest_paths(G) ) D = nx.floyd_warshall_numpy(G) # ワーシャルフロイド法で距離⾏列を計算 # ダイクストラ法で全ノード間の最短経路を取得 # ダイクストラ法でノード3から他ノードへの最短経路を取得
  23. 回 実施日 トピック 9 06/13 グラフデータ 10 06/20 グラフ構造の諸指標 11

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