2014年02月09日

規模別対象値合計関数の両対数グラフ


 ニッチ度補遺

で作った窓についての続きです。

 対象値視点の規模別対象値合計関数 S_1(x) は次のように表せました。

 

 このS_1(x)の対数は次のようになります。

 

 したがって、S_1を両対数のグラフに書くとその曲線は

 

 となります。たとえば、pが正規分布の確率密度関数の場合、log(p)は上に凸の二次関数となり、+ξ で軸が正の方向に少し移動しますが、全体としては、やはり上に凸の二次関数になっています。

pdistwindow.png

ということで、以前書いたこのグラフは、 S_1 を両対数で描いたグラフということが分かりました。

 手元にあるいくつかの分布は、このグラフを描いたとき、二次曲線で近似するのは少し誤差が大きいようです。今後、どのような関数で近似できるのかを調べるのが今後の興味深い問題です。
 

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

ニッチ度補遺

 
 ロングテールは、ヒトの多様な欲望を満たす

 で、ニッチ度 c という変数xの逆数を定義して、その確率密度分布から、元のロングテール分布を再現できると書きましたが、そんなん元の x の確率密度分布からだって同じことできるじゃんと思うかもしれません(自分が思った)。

 ニッチ度 c の方が便利なのは、分布を具体的に理想的なべき乗則で考えると分かりやすいです。つまり x の相補累積分布関数 F_c(x) について、



とすると、その確率密度分布 f(x) は、



となりますが、ニッチ度 c = 1/x の補累積分布関数 G_c(x) について確率密度分布 g(x) を求めると、


(C は適当な定数)


となり、c に対して一様になります。S_1、つまり対象値視点の規模別対象値合計関数が定数になるのも同様です。S_1の方は、私たちの実体験を関数で表したものであり、g(c)が同じ関数で書けることも g(c)がとても便利な点です。

 gとS_1がなぜ同じになるのか、まだちょっと直感的に理解していないのですが、良くF_c(x) = P_c(log x)のように log x で変換して考えるので、すべて log 空間で考えると分かりやすいのかもしれません。互いに行き来する演算子みたいなの定義して書くとか。

 ちょっとまだそこまでこなれていないのですが、その準備として、F_c(x) = 1/x という式について、P_c の表記で一通り書いておきます。



 従って、


 となり、同じ関数になります。それが決定的な意味を持つのかはよく分かりませんが、S_1 や g に関して、


と定数になることがわかります。

 ついでに p を log で変換した p^l を考えると、

となりますが、これを微分した関数は定数になっていて、似たような変換は S_1 を求める時にもやっているので、この両対数での p' は S_1 と同じような意味を持つのではないかとにらんでいます。

 特に、ロングテールは対数正規分布で近似できることがあるのですが、その確率密度関数φについて、同様の操作を施すと、



と上に凸の二次関数になっています。このとき元の分布は対数正規分布になります。
pdistwindow.png
つまり、このグラフ上でいろんな形の分布を作ってやることで、現実の様々なロングテールをより上手に近似することができるでしょう。またこのグラフの意味が分かれば、ロングテールを調べるということは、このグラフを調べることになるかもしれません。

 一般にロングテールというと、このグラフ上で実際の窓を直線で近似してその傾きを調べていると思いますが、そんな近似はとても原始的で、今後は少なくとも上記のように二次関数などで近似することが必要になってくるのではないでしょうか。



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

ロングテールは、ヒトの多様な欲望を満たす


 共感で複雑ネットワークを作る

 では、共感という条件を導入することで、ロングテール構造を持つ複雑ネットワークができることを示しました。できたのは3日前くらい。

 今回は、同様の考えで、ロングテール分布を発生させることができる仕組みを考えます。ニッチ度という指標を使います。できたの今朝。共感で複雑ネットワークを作る の冒頭で書いた「最初にして最大の問題」で、それに対する答えに対応するものです。

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

の続きになるので、記号などはそれを引き継ぎます。

ニッチ度

 複雑ネットワークでも導入したニッチ度をここでも定義します。注目している変数 x に対して、ニッチ度 c は、
 c = 1/x
で定義します。逆にニッチ度 c のものを系に投入した場合、それは変数xについて 1/c という結果を生みます。ニッチ度の低いよりポピュラーなものを投入すると結果 x は大きくなり(例えば動画の再生数)、高いニッチ度のものを投入すると結果 x は小さくなります。

 さて、変数 x が相補累積分布関数 F_c(x) の分布を持つ時、 c がどのような分布を持つかを調べます。F_c は確率密度関数と相補累積分布関数の組、 p, P_c (p = -P'_c)を使って次のように書けているとします。

 

 これを用いると、ニッチ度 c の相補累積分布関数 G_c(c) は次のように表すことができます。

  

 (ここ最初の等号のとこ、符号が違いますね。いずれ直します)

 したがって、ニッチ度 c の確率密度関数 g(c) は次のようになります。

  
  

 これは、対象値視点の規模別対象値合計関数 で、導かれた対象値視点の規模別対象値合計関数 S_1 とまったく同じ関数です。

  

 これら一致する二つの式の意味を考えてみます。

 たとえば、ウェブページのアクセス数や、ニコニコ動画の動画再生数など、たくさんの人にアクセスされるような状況を考えます。

 たとえば、ニコニコ動画についての S_1 は次のようになっています。
accumbymagpercent.png
 これは、再生数の規模に応じて、どれくらい再生されているかというグラフですが、これの意味するところは、ある人がニコニコ動画でいろんな動画を100本楽しんだとすると、

 そのうちの37本は再生数5ケタ(1万回〜10万回)
 30本は再生数6ケタ(10万回〜100万回)
 23本は再生数4ケタ(1000回〜1万回)
 5本は再生数7ケタ(100万回〜1000万回)
 4本は再生数3ケタ(100回〜1000回)
 0.2本は再生数2ケタ(10回〜100回)
 0.1本は再生数8ケタ(1000万回〜)
 0.002本は再生数1ケタ(1回〜10回)

ということです。

 つまり、この人は再生数7ケタの動画も、6ケタの動画も、5ケタの動画も、4ケタの動画、3ケタの動画も楽しんでいます。

 これは、私たち自身の実体験そのもので、言い換えるとこの S_1 は、人々の平均的な欲求を規模の視点から見ていることになります。

 動画の再生数は、動画の優劣とは限りません。初音ミクが歌う動画という点ではトップのものは1000万回を超えますが、一方で、クラシック曲を歌ったものでは再生数が数1000回でも絶賛されているものもあります。ミク×クラシックというニッチな需要に応えているからです。

 つまり人々の欲望は、規模の視点で広大な広がりを持っています。3ヶ月で3000万台以上売れるiPhoneを欲しいと思うこともあれば、近所のせいぜい100軒を商圏とするような街の豆腐屋さんの豆腐がお気に入りだったりします。 S_1 のグラフはそういった人々の欲望の広がりを表しています。

 一方、S_1と同じ関数でかけるニッチ度 c に対する確率密度関数 g(c)を使うことで、そのロングテールを発生させることができます。つまり、この確率密度関数 g(c)を使ってニッチ度 c のものを発生させると、それぞれの c にしたがって結果 x (例えば再生数)が生まれ、その分布がロングテールになります。

 その一つの具体的な例が、共感で複雑ネットワークを作る で作った複雑ネットワークです。そこで用いた共感という条件では、ニッチ度 c のノードを発生させると、概ね1/c に比例した数フォローされるため、次数の分布はロングテールになります。

 そして、この S_1 や g は、もとの分布が理想とされる係数 -1 のべき乗則、つまり F_c(x) = 1/x のとき、定数になります。つまり、小さいものから大きいものまで一様に需要がありそれに答えている状態のとき、理想的なべき乗則が生まれるのです。


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

2014年02月08日

共感で複雑ネットワークを作る


 ここ10年ちまちまロングテールをいじっていましたが、最近ニコ動の800万本の動画データを使って、ついに再生数視点の規模別合計を作ることができました。
 残るは究極の問い、どうしてそのような分布が発生するのかと言う問題。たとえば、このグラフ、事業所従業者数の順位分布は、
longtaillog.png
ほぼ完璧なべき乗則です。なぜこうなるのか。どういう作用が働けばこうなるのか。それが最初にして最大の問題でした。

 一応こんな風にやってみようかというのはあるんですけど、具体的に書けていません。

 そしたら、今までwikipedia+αなくらいしか知らなかった複雑ネットワークの話を改めて読んでみたら、まずはこっちでなにかできそうな感じがしました。

 理想状態での複雑ネットワークを考える

 事業所従業者数の順位分布みたいなのは、複雑ネットワークみたいに口コミとかとかあるわけではないですが、べき乗則を取っています。なにかいろんな力が働き続けた結果としての分布です。

 複雑ネットワークでもそのような究極の状態があると仮定します。もし、ツイッターのような場で参加者全員が全てのユーザーを知ったとしても、全員をフォローするわけではありません。ある基準でフォローするかしないかを決めます。つまりフォローする人数は一部です。その状態でもたくさんフォローされる人されない人が出てくるはずです。そのフォローするしないの基準を決め、全員が全員を見てフォロしたりしなかったりすることで、「スケールフリー性」「スモールワールド性」「クラスター性」を有する複雑ネットワークが作れるかというのが、最初の課題です。

共感によるフォローの決定

そこで次のようなフォロー基準を考えます。

各参加者は、ニッチ度 c (正の整数)と、内部状態 i (正の整数)を持つ。参加者 s は、次の共感条件を満たすとき参加者 t をフォローする。

i_t mod c_t = i_s mod c_t

つまり、自分と相手の情報 i を相手のニッチ度 c で割った余りが一緒だったらフォローします。

今、参加者 n (n = 1 〜 N) がいるとします。各参加者のニッチ度 c_n は、

c_n = n + 1、

内部情報 i_n は、Nより充分大きな乱数とします。

この状態で、各参加者が全ての参加者との共感条件を調べ満たすものはフォローした飽和状態のネットワークを考えます。

まず、「スケールフリー性」は自明です。参加者 n は n+1のニッチ度を持ち、つまりおおむね N/(n+1)の人と余りが一致してフォローされます。したがって順位 r とフォロー数つまり次数 d との関係は、

d = 1/(r+1) ≒ 1/r

となり、これはべき乗則です。なお、c_n = n + 1 と +1 しているのは、参加者1のニッチ度を1にすると全員からフォローされてしまうため、参加者1のニッチ度は2とし、半分の人からフォローされるようにするためです。

 「スモールワールド性」「クラスター性」ですが、計算で出せるか分からないので、とりあえずcytoscapeで解析しました。



ノード10個(エッジ数29)
10.png
ノード100個(エッジ数489)
100.png
ノード1000個(エッジ数7549)
1000.png
ノード10000個(エッジ数97673)
10000.png

characteristic path lenth はノードが10倍になるごとに1程度増えているので、スモールワールド性は満たしていていそうです。ちょっと値が大きい気がしますが、有向グラフなのでこんなもんでいいのでしょうか。

「クラスター性」はこれで充分大きいと言えるのか、小さすぎるのか良く分かりません。今後の課題です。

伝搬によるネットワーク形成

 以上、共感を定義することで、理想の状態、つまり相手に共感するか全員が全員を見られる場合では複雑ネットワークができることを見てきました。

 しかし、現実でそのようなことはできません。各参加者はなにかの機会によってごく限られた参加者のみと接触し、共感する相手にフォローをしていきます。

 なにか、伝搬の仕組みを作ることで、やはり複雑ネットワークになるのか、検討しました。まず、参加者を一人参加させます。

 そして伝搬には次の3つを考えました。

1. 近隣: 参加者番号の近い参加者同士は物理的に近くにいるとし、既にネットワークに加わっている参加者は近くにいる参加者に共感してくれるかをランダムに依頼します。

2. ランダム: ネットワークに加わっている参加者はランダムに参加者を選び共感してくれるかをランダムに依頼します。検索などで遭遇するような場面を想定しています。

3. リンク先のチェック: ネットワークに加わっている参加者は、自分がフォローしている参加者がフォローしている参加者について、共感するかをチェックします。

 これらの伝搬を繰り返し、ネットワークが広がるかを調べました。

飽和ネットワークでこのような結果が出るエッジ数5817の系に対して(上記と違うのは、ニッチ度の生成関数などをいろいろ変えているためです)、

netstatsatu.pngdegstatsatu.png

伝搬によってネットワークを生成したところ、エッジ数4819の次のようなネットワークができました。

netstatlooped.pngdegstatlooped.png

飽和状態には到達していないものの、複雑ネットワークとしての性質を持つものができました。

 ただし今のところランダムによる成長が主流で、それならできるのは当たり前の気がするので、ランダムに頼らない伝搬モデルがあるのかが気になるところです。

以上、共感条件を定義することで、複雑ネットワークが形成できること、また一つの起点から複雑ネットワークを成長させることができることを示しました。


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

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 | 記事 | このブログの読者になる | 更新情報をチェックする