mots quotidiens. | |
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp | by hns, version 2.10-pl1. |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
iTHMMについて,
こちらで
図入りでものすごく詳しく解説してくれています。嬉しいですね。
実装には前提知識がないと半年以上, 上の記事を書くにも一週間以上かかっている
とのことで, そうだろうなと思います。
途中で出されている2つの疑問について,
#define cons make_pair double Node::nu () { pair<double,double> beta; double a, b, decay = pow (param->lambda, level); if (!tssb->parent) { /* Be(1, gamma) */ a = 1; b = param->eta * decay; } else { beta = tssb->parent->vsplit (code()); a = tssb->param->alpha * beta.first; b = tssb->param->alpha * beta.second * decay; } return (a + stop) / (a + b + stop + through); } pair<double, double> TSSB::vsplit (vector<int> code) { vector<int> here; return vsplit_ (tree, code, here, 1); } pair<double, double> TSSB::vsplit_ (Node *node, vector<int> &code, vector<int> &here, double stick) { int k; double p = node ? node->nu() : empty->nu (here); if (code.empty()) { return cons (stick * p, stick * (1 - p)); } else { k = shift (code); here.push_back (k); if (node && k < node->children.size()) return vsplit_ (node->children[k], code, here, stick * (1 - p)); else return vsplit_ (NULL, code, here, stick * (1 - p)); } }
θt 〜 Dir(αθt-1)とすればよいように思えます。 実際, NTT岩田君の2009年のIJCAIの論文 "Topic Tracking Model for Analyzing Consumer Behavior" でも基本的にこの方法が使われています。(ただしαが時変なので, 下の議論とは 正確には異なっています。後述)
これは一見よさそうに思えるのですが, 少し考えていて, 実はこれは時系列モデル
としては適切でないことに気付きました。
いま, 問題を最も簡単にして, 二項分布の確率
ptの時系列を考えてみます。これは上の二次元版なので,
pt 〜 Be(αpt-1,α(1-pt-1))になります(Be()はベータ分布)。 ベータ分布 Be(a,b) からの乱数は, スケール係数1 *1 のガンマ分布からの乱数 γ1〜Ga(a,1),γ2〜Ga(b,1)を生成して p = γ1/(γ1+γ2)とすればよいので, 上記の時系列モデルでは Ga(αpt-1,1)のような乱数を引くことになります。
ここでGa(a,1)はaが小さい値のとき, 0方向にきわめて偏った分布なので, pがすでに0に近い値のとき, 次の時刻の確率の値が今より大きくなる確率は pが小さいほど, どんどん小さくなっていきます。つまり, pが小さくなる方向に バイアスがかかることになります。
ということで, 実際にMATLABでプログラムを書いて試してみました。
初期値がp=0.5のとき, 上記の時系列モデルで, α=1,10,100のときの結果が以下です。
α=1のとき
α=1やα=10では, 予想通り確率が最終的に0または1に吸い込まれ, 戻って これなくなることがわかります。 α=100では吸い込まれることは少ないですが, 逆にスケールが非常に大きい(=中間の 確率密度がきわめて高い)確率分布を仮定していることになるので, 確率が0や1に寄る ことができず, ほとんど0.5前後の値だけをふらふらすることになります。
というわけで, 多項分布の時系列には多項分布をそのままディリクレ分布で考える
のは不適切で, 他の分布, たとえばガウス分布をロジスティック変換したもの
(ロジスティック正規分布)のようなものを考えた方がいいように思えます。
ちなみに上の岩田君の論文では, αは固定ではなく, 時刻t毎に推定するとしている
ので, この問題は回避されていると思います。
実際にロジスティック分布, つまりガウス分布の通常のランダムウォークを
ロジスティック変換した時系列は以下のようになります。
α=0.5のとき | α=1のとき | α=10のとき |
タイトル一覧 |