読者です 読者をやめる 読者になる 読者になる

y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

トピック数による Hellinger 距離の分布

前回は、Hellinger 距離を利用して類似の記事を抽出してみました。基準にする記事と他の各記事との距離をそれぞれ計算して、距離の小さなものほど似ているということでした。

ところで、この Hellinger 距離は全体としてどのような分布になっているのでしょうか。今回はこれを調べてみたいと思います。前回までに作成したスクリプトを使って得られた Hellinger 距離に対して、その分布のヒストグラムを描いてみます。ヒストグラムの作成には次のようなスクリプトを使いました。

#!/bin/awk -f
BEGIN {
    max /= width;
    max = int(max + (int(max) == max ? 0 : 1));
}
{
    class = $1 / width;
    class = int(class + (int(class) == class ? 0 : 1));
    count[class]++;
    if (max < class) max = class;
}
END {
    for (i = 0; i <= max; i++) printf("%3.1f\t%d\n", i * width, i in count ? count[i] : 0);
}

max にデータの最大値、width に階級の幅をそれぞれ指定します。今回は max = 2.0, width = 0.1 としてヒストグラムを作成します。Hellinger 距離の定義からは両端の値 (0 と 2) はどちらも存在し得るのですが、距離が 0 になるのは確率分布が完全に一致する場合ですので、こちらを特別扱いすることとして、各階級は切り上げ計算することにしました。

トピック数により分布の形状が変わってくることが予想できますので、トピック数を 10, 20, ..., 100 として、それぞれ同じ実験を繰り返し、ヒストグラムを描いてみました。作成した 10 枚のグラフを列挙します。距離 0 の階級は、Hellinger 距離が厳密に 0 になるものです。今回の実験では、どのトピック数でも 1 (基準にした記事そのものだけ) でした。その他の階級は、Hellinger 距離が (中央値 - 0.5) < x <= (中央値 + 0.5) の範囲にあるデータの個数を表します。

f:id:y_uti:20130519091755p:plain
f:id:y_uti:20130519091802p:plain
f:id:y_uti:20130519091806p:plain
f:id:y_uti:20130519091809p:plain
f:id:y_uti:20130519091811p:plain
f:id:y_uti:20130519091814p:plain
f:id:y_uti:20130519091817p:plain
f:id:y_uti:20130519091820p:plain
f:id:y_uti:20130519091823p:plain
f:id:y_uti:20130519091826p:plain

トピック数が大きくなるほど分布が尖ってくることは予想していたのですが、分布の平均が少しずつ左に寄ってくるというのは、私にとっては意外な結果でした。ですが、これは LDA のパラメータ alpha を 0.1 で固定していることが原因で、実験の方法に問題があったかもしれません。各トピックに alpha の仮想的な観測が加算される効果を持つので、alpha を固定すると、トピック数が大きくなるほど全体に対する効果が大きくなってしまいます*1。このあたりは、また改めて調べてみようと思います。

*1:以前に参照した論文で、alpha を 50 / トピック数 に設定するというのは、まさにこういうことだったのですね。