Mais conteúdo relacionado
Semelhante a 大規模ネットワーク分析 篠田 (20)
Mais de Kosuke Shinoda (6)
大規模ネットワーク分析 篠田
- 2. 自己紹介自己紹介自己紹介自己紹介
• 所属
(独)理化学研究所 基幹研究所 光グリーンテクノロジー特別研究ユニット
• 学位
博士(知識科学)博士(知識科学)博士(知識科学)博士(知識科学) 北陸先端科学技術大学院大学 知識科学研究科
• 専門
– 社会シミュレーション、ネットワーク分析
• ネットワーク分析の対象
– ネットワークの成長モデル
– 学術・国際会議ネットワーク
– 公共交通機関(鉄道、高速道路、バス)
2012/10/10 ビックデータとスマートな社会(第4回) 2
- 17. • 平均経路長
– 任意のノード間の経路長の平均値
• 直径・半径
– ネットワーク内にある、最短経路長の最大の値
• モジュラリティ、クラスタリング
– コミュニティ(ネットワークの密度が高いコンポー
ネント)の抽出
• 中心性分布
– ネットワーク中心性指標のヒストグラム
2012/10/10 ビックデータとスマートな社会(第4回) 17
- 27. Page Rank
• リンク構造から重要ノードを算出する
• EigenVector(固有値)を計算する式に、任意の
ノードへの遷移を想定したアルゴリズム
• アルゴリズム
– 初期値 ܲ
= 1
– ܲ
= 1 − ߙ ∑ ܲ
ିଵ
/ܦೕ∈ா + ߙ ∑ ܲ
ିଵ
– ߙ = 0.15 (任意のノードへの遷移)
2012/10/10 ビックデータとスマートな社会(第4回) 27
- 28. HITS
• グラフ内のオーソリティ(情報提供)とハブ(情報収
集)を抽出する手法
– 有向グラフを前提
– 無向グラフである場合は、固有値の計算と同じ
• アルゴリズム
– 初期値: ݔ
= 1, ݕ
= 1
– オーソリティ: ݔ
= ∑ ݕ
ିଵ
:ೕ∈ா
– ハブ: ݕ
= ∑ ݔ
ିଵ
:ೕ∈ா
– 正規化: ݔ
/∑(ݔ
)ଶ
, ݕ
/∑(ݕ
)ଶ
などで正規化
2012/10/10 ビックデータとスマートな社会(第4回) 28
- 31. グラフ記述言語
• Edge List
– ノードの対のみの記述方式
• Pajek NET
– 解析ソフト Pajek で扱っている記述方式
– ノード、エッジは別ファイルに記述する
• Graphviz DOT
– 描画ツール Graphviz が定義した記述方式
– ノード、エッジは1ファイルで記述。
– ノード座標指定なども可能
• Graph ML
– XMLベースの記述言語
2012/10/10 ビックデータとスマートな社会(第4回) 31
- 34. Graph ML
• XMLベースの記述言語
• 例)
<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns=http://graphml.graphdrawing.org/xmlns
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns
http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<graph id="G" edgedefault="undirected">
<node id="n0"/>
<node id="n1"/>
<edge id="e1" source="n0" target="n1"/>
</graph>
</graphml>
• 参考: http://graphml.graphdrawing.org/
2012/10/10 ビックデータとスマートな社会(第4回) 34
- 36. データ解析手法データ解析手法データ解析手法データ解析手法
• 分析ソフトを用いた解析
– 定型の解析は行える
– 100万ノードを歌うものもあ
るが、現実的には数万ノー
ドの計算、数千ノードの描
画が限界
• 代表的なソフトウェア
– Gephi
– Cytoscape
– Pajak
– R: 統計解析・可視化ソフト
• ライブラリを用いた解析
– 独自の解析、大規模な解
析も可能
– 実装が必要、描画をさせ
るにはさらに苦労が…
• 代表的なライブラリ
– Boost/graph: C++
– RGL: Ruby
– Graphstream: Java
– Graphviz: C, C++
2012/10/10 ビックデータとスマートな社会(第4回) 36
- 37. Gephi
• 特長
– Java ベース
– Windows, Mac OS, Linux と複数のプラットフォームで動作
• ただし、Linux では描画周辺に難あり
– 多数のグラフ記述言語に対応
• Graph ML, Graphviz DOT, Pajek NET, etc.
– 描画レイアウト、分析などがプラグインで追加可能
• 配布
– https://gephi.org/ 最新版(日本語表示対応)
– 日本語解説
http://oss.infoscience.co.jp/gephi/gephi.org/index.html
2012/10/10 ビックデータとスマートな社会(第4回) 37
- 39. • 特長
– 主に Bio-informatics 分野にて利用されている
– データ統合/解析/可視化プラットフォーム
– 比較的多数のデータ形式への対応
• GML, XGMML, GraphML, CSV など
• サイト
– http://www.cytoscape.org/
– 日本語解説
http://cydoc.sourceforge.jp/cydocwiki/
Cytoscape
Cytoscape: An Open Source Platform for Complex Network Analysis and Visualization
2012/10/10 ビックデータとスマートな社会(第4回) 39
- 41. Boost/Graphを用いた実装を用いた実装を用いた実装を用いた実装
• Boost は C++用ライブラリ群
– Boost/Graph はそのなかの一つのグラフデータ処
理用ライブラリ
– Boost 1.33.1 以降からは、ネットワーク分析用のメ
ソッドが徐々に追加されている
– ネットワークの構造的特長や、ネットワーク中心
性指標を計算するメソッドはほぼそろっている。
– 計算速度という点では他のライブラリより利点
2012/10/10 ビックデータとスマートな社会(第4回) 41
- 42. Ruby Graph Library (RGL)
• Ruby 用グラフライブラリ
– グラフ構造を管理するためのライブラリ
– ネットワーク分析にも使えるメソッドは多少ある
– 実装コンセプトは boost /graph と類似
• RGLの導入
– Ruby のライブラリ群の rubygems を用いてインス
トール
– サイト: http://rgl.rubyforge.org/rgl/
2012/10/10 ビックデータとスマートな社会(第4回) 42
- 43. GraphStream
• Java用グラフライブラリ
– 主に、グラフの描画を重視している
– グラフ分析用のメソッドも用意されている
– グラフデータの形式が幅広い
– 現在、積極的に開発が行われている
• 以前は JUNG がJavaのグラフライブラリとして利用されてい
たが、最近は開発が停止している様子
• GraphStream の導入
– サイト: http://graphstream-project.org/
– jar ファイルにクラスパスを通せば(コンパイル、実行
時だけでももちろん可)利用可能
2012/10/10 ビックデータとスマートな社会(第4回) 43
- 46. Boost/Graph with OpenMP
• OpenMP を利用するメリット
– マルチコアCPUを活用できる
– 既存のプログラムの拡張が容易
• スレッドなどをあまり意識する必要はない
– 主要コンパイラが対応
• (gcc, Visutal C++, Intel コンパイラなど)
– そこそこ、速度向上が見込める
• 速度をもとめるなら MPI のほうがよいみたいだが…
• OpenMP を利用するには
– gcc で作成したプログラムであれば、並列実行可能な部
分を拡張するだけでよい
– コンパイル時に –fopenmp を加えてコンパイルするだけ
• ただし、gcc 4.2 以降から正式サポート…
2012/10/10 ビックデータとスマートな社会(第4回) 46
- 48. OpenMPを用いた実装例を用いた実装例を用いた実装例を用いた実装例(2)
2012/10/10 ビックデータとスマートな社会(第4回) 48
#ifdef _OPENMP
#pragma omp parallel for private(i) schedule(guided) num_threads(omp_get_max_threads())
#endif
for(i = 0; i < num_vertices(g); i++){
//########## diameter, path length ##########
DistTable dist(num_vertices(g), 0);
breadth_first_search(g, i, visitor(distance_recorder(&dist[0])));
int count = 0;
VIter vi2, vi2_end;
for(tie(vi2, vi2_end) = vertices(g); vi2 != vi2_end; vi2++) {
if(i != *vi2 && (int)dist[*vi2] == 0)
count += (int)num_vertices(g);
else
count += (int)dist[*vi2];
if(diameter < dist[*vi2]) {
diameter = (int)dist[*vi2];
}
}
score[i] = (float)count / (float)(num_vertices(g) - 1);
}
OpenMPの宣言部の宣言部の宣言部の宣言部
下記下記下記下記ののののfor文のスレッド作成文のスレッド作成文のスレッド作成文のスレッド作成
スレッド割当ルール指定スレッド割当ルール指定スレッド割当ルール指定スレッド割当ルール指定
スレッドを実行するスレッドを実行するスレッドを実行するスレッドを実行するCPUの数の指定の数の指定の数の指定の数の指定
- 49. OpenMPの注意点の注意点の注意点の注意点
• for 文では、iterator は利用できない
2012/10/10 ビックデータとスマートな社会(第4回) 49
for(tie(vi, vi_end) = vertices(g); vi != vi_end; vi++) {
//########## diameter, path length ##########
DistTable dist(num_vertices(g), 0);
breadth_first_search(g, *vi, visitor(distance_recorder(&dist[0])));
int count = 0;
VIter vi2, vi2_end;
(中略)
score[*vi] = (float)count / (float)(num_vertices(g) - 1);
}
#ifdef _OPENMP
#pragma omp parallel for private(i) schedule(guided) num_threads(omp_get_max_threads())
#endif
for(i = 0; i < num_vertices(g); i++){
//########## diameter, path length ##########
DistTable dist(num_vertices(g), 0);
breadth_first_search(g, i, visitor(distance_recorder(&dist[0])));
int count = 0;
VIter vi2, vi2_end;
以下略
- 52. 隣接行列からグラフデータを生成
2012/10/10 ビックデータとスマートな社会(第4回) 52
matrix = [[]] # 行列
rows = [] # row name
cols = [] # col name
begin
colp = true
n_row = 0 # 行数をカウント
File.open("sample.dot").each { |line| # ファイルを開き,1行ごとに読み込み
items = line.chomp!.split(",")
if(cols)
1.upto(items.size-1) { |n| # 1 から (items.size-1) まで数え上げる
cols.push(items[n]) # 列のヘッダを保存
}
cols = false
next # 現在のループを終了して次のループに以降
end
rows.push(items[0])
values = []
1.upto(items.size-1) { |n|
values.push(items[n].to_i) # items[n].to_i は、整数値に変換している
}
n_row += 1
}
- 53. 2012/10/10 ビックデータとスマートな社会(第4回) 53
# graphviz DOT ファイルの出力
puts "graph G{" # graphviz DOT 宣言
puts "node [shape=rect]" # node の共通属性
puts "edge [style=dotted]" # edge の共通属性
n_row = 0
n_col = 0
matrix.each { |col|
col.each { |v|
if v == 1
puts "#{rows[n_row]} -- #{cols[n_col]}" # edgelist を出力
end
n_cols += 0
}
n_rows += 0
}
puts "}"
end
前の続き
- 54. J-Stageの論文メタデータの論文メタデータの論文メタデータの論文メタデータ取得取得取得取得(1)
• Twitter を含む論文を取得
2012/10/10 ビックデータとスマートな社会(第4回) 54
getJSTAGE_twitter.rb
require 'net/http'
begin
Net::HTTP.version_1_2
AGENTNAME = 'Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.4) Gecko/200705'
@crawler = Net::HTTP.start('api.jstage.jst.go.jp', 80)
@query = “/searchapi/do?service=3&system=3&keyword=twitter”
puts @crawler.get(@query, 'User-Agent' <= AGENTNAME).body
end
← ネットワークライブラリの呼び出し
← HTTPを使うときのおまじない
← TCPの接続準備
← クエリー
← 結果を出力
キーワード指定サーバーとの通信
実行環境
% ruby getJSTAGE_twitter.rb
- 55. J-Stageのののの論文メタ論文メタ論文メタ論文メタデータデータデータデータ取得取得取得取得(2)
• 任意のキーワードを含むXMLデータの取得
2012/10/10 ビックデータとスマートな社会(第4回) 55
getJSTAGE.rb
require 'net/http'
begin
Net::HTTP.version_1_2
AGENTNAME = 'Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.4) Gecko/200705'
@crawler = Net::HTTP.start('api.jstage.jst.go.jp', 80)
word = URI::encode(ARGV[0])
@query = “/searchapi/do?service=3&system=3&keyword=#{word}”
puts @crawler.get(@query, 'User-Agent' <= AGENTNAME).body
end
wordの値の代入
日本語を含む検索の場合はエンコードが必要
コマンドラインオプションの読み込み
実行環境
% ruby getJSTAGE.rb キーワード
- 56. RGLのサンプルのサンプルのサンプルのサンプル
2012/10/10 ビックデータとスマートな社会(第4回) 56
require 'rubygems'
require 'rgl/adjacency'
require 'rgl/dot'
dg=RGL::DirectedAdjacencyGraph[1,2 ,2,3 ,2,4, 4,5, 6,4, 1,6]
# Use DOT to visualize this graph:
dg.write_to_graphic_file('jpg')
puts dg.directed?
puts dg.vertices
dg.add_vertex 7
dg.add_edge 2,7
dg.write_to_graphic_file('jpg')
← RGL ライブラリの呼び出し
←rubygems
←グラフ構造モジュール(近接ノード)
←グラフ記述モジュール(DOT形式)
←グラフの宣言
←描画
← ノードの出力
← エッジの追加
← ノードの追加
- 57. JJJJ----STAGESTAGESTAGESTAGE WebAPIWebAPIWebAPIWebAPI のののの注意点注意点注意点注意点
• アクセスの頻度に明確な条件はないが、適度な間隔
で
• 1回のリクエストには、最大2000アイテムまでなので、
それ以上のアイテムを取得するには、クエリのコント
ロールが必要。
• 詳細は、利用規約を確認のうえマニュアルを参照のこ
と
– http://info.jstage.jst.go.jp/info_server_api/terms_api.html
• なお、現時点(2012/09/24)でWebAPIは準備中になっ
てしまっているので、利用できないかもしれない。その
際には CiNii の利用を薦めます。
2012/10/10 ビックデータとスマートな社会(第4回) 57
- 58. Twitter データの簡易な収集
• Tiny Tweet Crawler(TTC)/Tiny Tweet
Tracker(TTT)
– 大阪大学松村准教授が提供するアプリ
• TTC: 検索キーワードを含むつぶやきを最大1500個取
得可能
• TTT: 検索キーワードを含むつぶやきを30秒ごとに取
得
– Windows/Macで動作
2012/10/10 ビックデータとスマートな社会(第4回) 58