2014年02月03日

おお、複雑ネットワーク楽しい。


 mac に計算させながらメモ。

 ロングテールはここ10年くらいちまちまいじってたので、それを元に、ブロマガでロングテールの連載を始めたわけですが、といっても、ニコ動の再生数とか統計量ばかり扱って、複雑ネットワークはwikipedia+αくらいを読むに留まっていました。

 が、連載するくらいならもう少し知っておかないとモグリだなと思って、またwikipedia+αを読んだのです。

 wikipediaによると

複雑ネットワークは「スケールフリー性」(次数分布のべき乗則)、「スモールワールド性」、「クラスター性」という性質を持つんです。


とありますが、まあそれも今となっては古いそうですが、そのモデルとなると、それら3つを満たすものはwikipediaには載っていなくて、

単純なアルゴリズムでありながら「スケールフリー性」「スモールワールド性」「クラスター性」という現実世界のネットワークの3つの特徴全てを満たすようなモデルが発表されている[7]。

とだけ書いてあります。

 へー、じゃあ、思いつくネットワークがそれを満たしているか試してみようと、Cytospaceをインストールして、rubyでちょちょとネットワーク作って、解析させてみました。数時間でそれだけできるって、世の中どんだけ便利なんだ。

 どういうネットワークかというと、

 もしも、全ての人が発信して全ての人がそれを見ることができて、共感したものにはリンクを張るみたいな世界。

ノードをN用意する。
各ノードは、固有の情報 i を持っていて、0から100万-1の整数どれか。乱数で決定。
また、各ノードにはニッチ度 e を持つ。今回は単純化のため、ノード番号 n (1からN) をそのまま e。 e = n。
で、ノード s が、 ノード t を見たとき、共感したらリンクを張る。共感の条件は、
i_t mod e_t = i_s mod e_t
つまり、自分と相手の情報 i を相手のニッチ度 e で割った余りが一緒だったらリンクを張る。ニッチ度eが小さい人ほど、相手と余りが合う確率が高いのでたくさんリンクをもらえる。ニッチ度が高いと余りが合いにくくて、あまりリンクは張られない。

ノード10個(エッジ数29)
10.png
ノード100個(エッジ数489)
100.png
ノード1000個(エッジ数7549)
1000.png
ノード10000個(エッジ数97673)
10000.png
まだ使い始めでよく分からないけど、「スモールワールド性」「クラスター性」はまあまあいいのではないでしょうか。「スケールフリー性」はよく分からないです。この分野では、次数とその頻度を両対数でプロットしているようですが、それだとまんなかにコブができてしまいます。いつも使っている順位と次数のグラフだと、完全に(順位)×(次数)=定数 つまり 1/x のべき乗則が成り立っているので、ものすごい「スケールフリー性」のはずなんですが。順位のグラフの方がx一乗分多いはずなので、そちらで 1/(x^2)くらいのを作れば、次数とその頻度の方が1/xになると思われます。

これを、全員が完全にお互いの情報を見れたときにできる最終系のネットワークとして、でも実際は見られる情報は限定されているので、どういうプラットフォームを作れば、この最終系に近づけるかという感じでアプローチすると楽しそうです。


posted by 産業創出ネットワーク at 23:45 | 記事 | このブログの読者になる | 更新情報をチェックする

2014年02月02日

対象値視点の規模別対象値合計関数


 とりあえず、自分のためメモ。ノートに数式書いても汚くて読めない……。

[番外編]ニコニコデータセットに感謝。真の「規模別合計」問題をねじ伏せれた。

の続き。対象が対数正規分布で近似できる場合を考えた。

正規分布の確率密度関数と相補累積分布関数(対数正規分布ではない)




対象のロングテール分布を対数正規分布 f で近似する。fの相補累積分布関数F_cは



この式とロングテールの順位分布関数(対象が持つ値を降順に並べたときの分布)との関係は、
順位を r 対象値を x とすると



となっている。

導入した順位視点の規模別による対象値合計関数 S は rx である。順位 r が変数のとき、この関数は、規模が r 付近のxの合計値を示す。

一方、xを変数として書くと、



となる。これは対象値が規模 x 付近の順位 r の合計値を表す。これを対象値の合計としたい。

そのために F_c の両対数空間での曲線の傾きで補正する。
X = log x, F_l = log F_c として書き直すと、



これを微分する。



(Φ'_c は -φ。この比は Mills ratio と呼ばれるものの逆数らしい。)

順位合計 S から、対象値合計 S_1 を求めるには -F'_l をかけると良い(証明はしていないが、実データで計算する限り正しい模様)。




以上、非常にすっきりした形で書けていることがわかった。なお、 Φ 特有の性質は使っていないので、確率密度関数と相補累積分布関数の組、 p, P_c があって、 r = P_c(log x) の形で書けているなら、S_1 = x p(log x) の形で書けていると考えられる。

 

ちなみに「-F'_l をかけると良い(証明はしていないが、実データで計算する限り正しい模様)」の部分、手元でやった計算結果はこんな感じ。
magniaccumcomp.png
 完全に一致した。証明はしてないけど一致すると考えて問題ないはず。この結果を得るには、F'_l つまり傾きを計算する必要があるが、安定した結果を得るのは簡単ではない。今回一番良かったのは、とびとびのデータを3次スプライン曲線で補間して計算したもの。DPLN分布ではうまく近似できず、対数正規分布でもざっくりとは近似できたが、ここまでぴったりにはできなかった。3次スプライン曲線の方法も、とびとびの値の取り方や横軸の取り方に工夫が必要だった。

 他にも3次スプライン曲線の方法適応して調子がいいようなら、この統計値も安心して使えるようになるだろう。いろいろ試してみるのが楽しみ。

 実データの集計の方は、データ数が少ないと、集計区間を細かくするとすぐばたばたする。[番外編]ニコニコデータセットに感謝。真の「規模別合計」問題をねじ伏せれた。
では試しに4万件程度で試したが、そこのグラフ以上には細かくできなかった。

 しかし、800万以上データがあると見ての通りばたつかない。昔はせいぜい2000件程度のデータしか持ってなかったので、この辺りは全く手が出なかった。まさにニコニコデータセットのおかげ。



posted by 産業創出ネットワーク at 10:34 | 記事 | このブログの読者になる | 更新情報をチェックする

2014年01月31日

真の「規模別合計」をねじ伏せれた、のこぼれ話


 以前、

 ロングテールを調べるのに便利な「規模別合計」の数学的解説

で、「規模別合計」について解説したけど、今日少し進んだ。ニコ動のニコニコデータセット使ったので、ブロマガの方に書きました。

[番外編]ニコニコデータセットに感謝。真の「規模別合計」問題をねじ伏せれた。

 こぼれ話。最近ニコ動のブロマガの方で始めたロングテールの連載は、割と前からやりたいと思っていたこと。なので、一昨年ニコ動が動画の生データを公開したときも、もちろん、私は飛びついてダウンロードした。が、データ形式が JSON というエクセルでは直接扱えない形式の上、データファイルの数が1925もあって、サイズ合計は12GB。そもそもファイルごとに圧縮されているので、それを全部展開するところから始めないといけない。rubyあたりでいじるか〜、と思いつつもなかなか手が出ないでいた。

 昨年末、ゆく年くる未来で ruby と csv を使ってリンクを生成した余韻が残ったまま、地図関係で久々にエクセル使いまくって、そのまま久々にロングテールに飛び火して、ということで「いましかない」と勢いで12GBの JSON ニコニコデータセットをrubyにかませた。1年以上の懸案がついに動いてめちゃくちゃ快感。

 で、その膨大なデータのおかげで、ついに10年近く気になっていたけど確かめられなかった問題に切り込むことができた。

 こういう話って、ツールやデータが日進月歩なので、急がないならいくらでもペンディングした方が、どんどん楽になる。ある日、あ今ならできるかも!って瞬間が来るまで待つということ。

 もちろん、勝ちたい競争ならそんなこと言ってられないけど、むしろ誰かやってくれないかなでもいい話ならこやってのんびりいっぱい開店休業しておくと、結果として効率いいのではないだろうか。
posted by 産業創出ネットワーク at 20:19 | 記事 | このブログの読者になる | 更新情報をチェックする

2014年01月21日

geofuse の地名一覧はどこに。

 ブロマガの方で、47maps使っていろいろ地図を作って載せてるけど、自分の作ったデータでも geofuse を使えば表示できると言うところまでは分かった。 で、ちょっとやってみたのだけど、 スクリーンショット 2014-01-21 20.30.36.png こんな感じでところどころ歯抜けになる。多分地名が変わったかとか合併したとか町から市になったとかそういうのじゃないかと思うのだけど、geofuse 側でどういう地名で登録されているか不明で合わせようがない。 ソース見ても、ドキュメントないし。インストールしてデータベース覗けば分かるのだろうけど、そこまでしないでもわからないかなあ。 そもそも、どういうオプション?レイヤー?(都道府県とか市町村とか)があるのかすらよく分からない。 もちょっとだけ情報整理してくれれば使えるのにぃぃぃぃぃ。
posted by 産業創出ネットワーク at 21:42 | 記事 | このブログの読者になる | 更新情報をチェックする

2014年01月16日

Ruby でエクセルのCSVを読み込む方法

 年末にゆく年くる未来をやったとき、キーワードを並べるためにエクセルと Ruby を使った。エクセルに各キーワードを入力してCSVで出力してRubyで整形。

 簡単なことのように見えて、漢字コードの問題があって、なかなかうまくいかない。
 それは良く知られたことなので、ネットで調べるといろいろ出てくるのだけど、どれもうまくいかない。結局いろいろ総合して、下記のコードでうまくいった。


require "csv"
require "kconv"
filename = 'yukutoshi.csv'
CSV.parse(File.read(filename).toutf8.gsub(/\r/, "\n")) do |row|
# 処理
end


ポイントは、漢字コードの変換だけではだめで、改行コードも変えないと読み込めないんだけど、ネットの情報だとそこんとこごまかしてるのが多くて、それがうちだとなぜかうまくいかない。

ちゃんと \r から \n に変換してやったらうまくいった。

という自分用メモ。

この作業一年に一回しかやらないかもしれないので、また次回も同じところではまって、同じようにぐぐったら、最初にこれが出てきますように!
posted by 産業創出ネットワーク at 16:34 | 記事 | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。