Hatena::Grouptumblr

saitamanodoruji

くこかー
saitamanodoruji.tumblr.com

2014-08-31

Exponential Endless Summer 2014

23:51 | Exponential Endless Summer 2014 - saitamanodoruji を含むブックマーク はてなブックマーク - Exponential Endless Summer 2014 - saitamanodoruji

要旨

Exponential Endless Summer (EES) を改訂しました. 第 4 版です.

今回は 2013-07-01 から 2014-06-31 までの Tumblr の Post ID を月毎に調べて指数関数でフィットし (Fig. 1), パラメータをスクリプトに追加しました.

Fig. 1 Tumblr の月毎の Post ID と指数関数によるフィット. 縦軸は対数. 青点が実測値, 赤実線がフィットカーブ (計算値). 16 の区間に分割してフィットしている.

http://f.st-hatena.com/images/fotolife/s/saitamanodoruji/20140830/20140830082545.png

今回新たにフィットをかけた 2013-07-01 以降の区間では, EES2014 の方が実測値に近い Post ID を算出できます (Fig. 2). 2013-07-01 より前の区間では EES2014 と EES2013.08 の関数は同じです.

Fig. 2 EES2014 と EES2013.08 の計算値の比較. Fig. 1 の 2011 年から 2014 年までを拡大したもの. 赤実線が EES2014 による計算, 赤破線が EES2013.08 による計算.

http://f.st-hatena.com/images/fotolife/s/saitamanodoruji/20140830/20140830085927.png

動作確認

EES2014 の性能を評価するために 10000 回の Post ID 選択を行い, 各月毎に選択回数を集計してヒストグラムを作成しました. 比較のために, 同様に EES2013.08 のヒストグラムも作成しました (Fig. 3). 2013-07 以降のポストが右肩下がりに選ばれにくくなってきていたところを修正できているのがわかります (Fig. 3 赤破線の円).

引いた Post ID に対する実際の日付及び時刻は http://www.tumblr.com/dashboard/2/{PostId} を取得して確認しており, 空の dashboard が返ってきた場合のデータは捨てています. Fig. 3 の EES2014 のヒストグラムで 2007-03 以前の Frequency が 2007-04 以後に比べて半分ほど小さいのは, 約 50 % の確率で空の dashboard が返ってきたことを意味しています. EES2013.08 では 2007-03 以前の Frequency が EES2014 ほど小さくないのは測定日の違いによる dashboard の底の変動の影響と考えています. タイミングによって古いポストが dashboard に現れたり現れなかったりする現象はよく見られます.

Fig. 3 EES2013.08 と EES2014 で引いた Post ID のヒストグラムの比較.

http://f.st-hatena.com/images/fotolife/s/saitamanodoruji/20140910/20140910185259.png

コード

// Exponential Endless Summer 2014
var draw = function(oldestID, newestID) {
  var oldestUTime = getUnixTimeFromPostID(oldestID);
  var newestUTime = getUnixTimeFromPostID(newestID);
  var drawnUTime = oldestUTime + Math.floor((newestUTime - oldestUTime) * Math.random());
  return getPostIDFromUnixTime(drawnUTime);
}

var getPostIDFromUnixTime = function(utime) {
  if ( utime < 1149465600000 ) {
    return;
  } else if ( utime === Number.POSITIVE_INFINITY ) {
    return Number.POSITIVE_INFINITY;
  }
  for (var i = 0; i < params.length; i++) {
    if ( utime <= params[i].upperBound ) {
      return Math.ceil(params[i].coefAlpha * Math.exp(params[i].coefBeta * (utime - 1136073600000)));
    }
  }
}

var getUnixTimeFromPostID = function(postID) {
  if ( postID < 1 ) { return; }
  for (var i = 0; i < params.length; i++) {
    if ( postID <= getPostIDFromUnixTime(params[i].upperBound) ) {
      return Math.floor(Math.log(postID/params[i].coefAlpha)/params[i].coefBeta) + 1136073600000;
    }
  }
}

var params = [
  // f_i(t) = Alpha_i * exp[Beta_i * (t - t_0)]
  // t: Unix time [msec]
  // t_0 = 1136073600000 [msec] (2006-01-01T00:00:00+09:00)
  {coefAlpha: 1.211 * Math.pow(10,  -1), coefBeta: 1.571 * Math.pow(10, -10), upperBound: 1160012789359},
  {coefAlpha: 3.619 * Math.pow(10, -13), coefBeta: 1.266 * Math.pow(10,  -9), upperBound: 1163269541924},
  {coefAlpha: 2.120 * Math.pow(10,   0), coefBeta: 1.846 * Math.pow(10, -10), upperBound: 1172120791893},
  {coefAlpha: 1.179 * Math.pow(10, -49), coefBeta: 3.331 * Math.pow(10,  -9), upperBound: 1173392561265},
  {coefAlpha: 4.702 * Math.pow(10,  -7), coefBeta: 7.024 * Math.pow(10, -10), upperBound: 1176405323219},
  {coefAlpha: 5.338 * Math.pow(10,   1), coefBeta: 2.425 * Math.pow(10, -10), upperBound: 1182930300850},
  {coefAlpha: 8.255 * Math.pow(10,   3), coefBeta: 1.349 * Math.pow(10, -10), upperBound: 1193299359828},
  {coefAlpha: 2.496 * Math.pow(10,   6), coefBeta: 3.509 * Math.pow(10, -11), upperBound: 1241622616806},
  {coefAlpha: 2.907 * Math.pow(10,   5), coefBeta: 5.546 * Math.pow(10, -11), upperBound: 1283088065116},
  {coefAlpha: 5.206 * Math.pow(10,   4), coefBeta: 6.716 * Math.pow(10, -11), upperBound: 1291075200000},
  {coefAlpha: 8.329 * Math.pow(10,   4), coefBeta: 6.521 * Math.pow(10, -11), upperBound: 1292241600000},
  {coefAlpha: 8.396 * Math.pow(10,   4), coefBeta: 6.541 * Math.pow(10, -11), upperBound: 1307576237376},
  {coefAlpha: 7.746 * Math.pow(10,   4), coefBeta: 6.588 * Math.pow(10, -11), upperBound: 1313586050187},
  {coefAlpha: 8.798 * Math.pow(10,   6), coefBeta: 3.922 * Math.pow(10, -11), upperBound: 1340572542928},
  {coefAlpha: 2.693 * Math.pow(10,   8), coefBeta: 2.249 * Math.pow(10, -11), upperBound: 1373049162025},
  {coefAlpha: 1.225 * Math.pow(10,   9), coefBeta: 1.610 * Math.pow(10, -11), upperBound: Number.POSITIVE_INFINITY},
]

使用例

http://saitamanodoruji.tumblr.com/exponentialEndlessSummer2014 にテストページを作りました.

謝辞

来年も夏が始まる頃に見直せるといいかなと思っています.

Exponential Endless Summer version 2013.08 - saitamanodoruji - たんぶら部 - Tumblove -

ダメでした.

夏、終っちゃうね。

the whole world is peaceful. (2014-08-29)

始まりました.

ありがとうございます.

追記 (2014-09-10)

Fig. 3 を EES2014 単独のヒストグラムから EES2014 と EES2013.08 の比較画像に差し替えて本文を編集しました.