CVB0 をC++で書いてみた

前回の記事で collapsed gibbs sampling (CGS) に基づくLDAのC++の実装を書いてみましたが、CVB0 [Asuncion+ UAI09] というLDAの推論方法の一つを id:tsubosaka さんがJavaで実装されていたようなので、乗りかかった船 (?) ということで、これもC++で移植してみました。今回はオプションを追加したり、ファイルが増えたりしたので、直接載せるのはしんどくなってきたので、github にアップロードしました。どなたかの参考になれば幸いです。一応 README.ja に説明書いてみました。


http://github.com/tettsyun/CVB0PP


上記のURLか、gitをインストールされているなら、下記のコマンドでダウンロードできます。修正 BSD ライセンスです。

git clone git://github.com/tettsyun/CVB0PP.git

github 使うの初めてなので、突っ込みどころ満載かもしれませんが、ご容赦ください。

インストール

cd CVB0PP
./configure
make
make install # オススメしません

動作確認は g++ 4.3.3 (Ubuntu 9.04), g++ 4.2.1 (Mac OS X 10.6.2) で行っています。ソースコードを配布するのは初めてなので、コンパイルとかうまくいかなかったら、ごめんなさい。

データ形式は、前回の LDA と同じ UCI Machine Learning repository の Bag of Words Data Setデータ形式にしています。データは各自でダウンロードしてください。以下に README.ja の一部を抜粋します。

* 使い方
 $ ./cvb0_learn bow_file vocab_file model [option]
 
 bow_file は 上記の Bag of Words Data Set のデータ形式の docword.*.txt に相当し,
 vocab_file は文書中に出現する全ての単語が各行に1つずつ書かれたファイルで vocab.*.txt です。
 model は 各クラスにおけるトピックの単語生成確率が出力されるファイル名です。model に出力される単語の
 生成確率は、指定された繰り返し後の単語生成確率です。
 
* オプション
  -K: トピック数 (デフォルト 50)
  -I: 繰り返しの回数を指定します (デフォルト 200)
  -W: 出力される、各トピックの単語およびその生成確率の数を指定します (デフォルト すべて)
      例えば -W=10 とすると、単語の生成確率の上位10件を出力します。

謝辞

id:tsubosaka さんには、実装に関するアドバイスや最近のLDAの論文を教えて頂きました。ありがとうございます。

余談

名前は CVB0++ にしたかったのですが、githubリポジトリ名に "+" を入れたら、 "-" になってしまい、しょうがなくCVB0PPにしました。誰か直して。

参考文献

  • [Asuncion+ UAI09] Arthur Asuncion and Max Welling and Padhraic Smyth and Yee Whye Teh, "On Smoothing and Inference for Topic Models", UAI 2009. pdf