• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
SMCTC ライブラリの使用方法
 

SMCTC ライブラリの使用方法

on

  • 640 views

[注意事項] 単なる調査&試行錯誤時のメモです。 ...

[注意事項] 単なる調査&試行錯誤時のメモです。
SMCTC: Sequential Monte Carlo Template Class
http://www2.warwick.ac.uk/fac/sci/statistics/staff/academic-research/johansen/smctc/
にて紹介されているライブラリの使用方法について, マニュアルとコードを読んでまとめたメモです.
RcppSMCパッケージ
http://dirk.eddelbuettel.com/code/rcpp.smc.html
での利用を想定していますが, 当然ながらライブラリ本体部分に関する説明はRcppSMCとは無関係です. RcppSMCはsmctcライブラリのGSL依存部分をR依存に置き換え, Rcppによる利用を簡単にしたRのパッケージであると私は解釈しています.
本文中で言及しているmyfilterは以下のプロジェクトにあります. smctcのドキュメントで説明されている例よりも単純なSSMです.
https://github.com/watermouth/RcppMySMC

Statistics

Views

Total Views
640
Views on SlideShare
637
Embed Views
3

Actions

Likes
1
Downloads
9
Comments
0

1 Embed 3

https://twitter.com 3

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    SMCTC ライブラリの使用方法 SMCTC ライブラリの使用方法 Document Transcript

    • マニュアルとコードを読み, RcppSMCを使用したSMCの方法を以下にまとめた.マニュアルメモ自体は本ノートの下部を参照.観測値はglobalな観測値クラスの配列に詰めておくものとする(global変数).粒子の初期化関数や重み計算関数などでglobal変数として使用する例がRcppSMCで与えられている(そこでは変数y).以下のmyfilter.cppを例にして使用方法をまとめておく.myfilter.cpp の抜粋1. samplerを生成粒子数と履歴保持について設定する. 履歴に依存するフィルタでなければSMC_HISTORY_NONEとする.それ以外は下のマニュアルメモ参照.2. movesetを生成粒子の初期化関数と粒子遷移関数, MCMC関数の設定を行う. それぞれ別途作成しておく.- 粒子の初期化関数は粒子を返すmoveset.DoInitで使用される.- 粒子遷移関数は指定した時刻のデータで粒子を遷移させる提案分布に該当する. Bootstrap filterではシステムモデルとなる.NOTE粒子の重みは規格化されていない対数尤度として保持されておりparticle.GetLogWeight()で取得出来る.これはlogweightを取得するゲッターである. logweightを更新するロジックもこの遷移関数に記述する.マニュアルやコードを見ると, AddToLogWeight()が使われており,1時点前の重みが対数尤度として表されており, それに対して新たな対数尤度を加算するというロジックとなる.元々の重みに対して1ステップのフィルタリング分の重みをかけることで, 粒子の重みを更新することになる.リサンプリングを行わない場合は重みが小さいものが残ってしまい, インポータンスサンプリングの観点からは良くないが, 解析的にはおかしなことをしているわけではない.moveset.DoMoveで使用される.numberは遷移ルールの個数. 単純な場合は1.- MCMC関数はDoMove後のMCMCサンプリング用3. samplerにリサンプリングパラメータを設定
    • マニュアルメモも参照のこと.4. samplerにmovesetを設定文字通り.5. samplerの初期化時刻変数(samplerのメンバ)T=0粒子の初期化: movesetのDoInit経由で指定した粒子の初期化関数による初期粒子セットを生成する.履歴保持データInitialize6. samplerの繰り返し処理と指標計算(sampler.Integrate)sampler.hIterateEss()を呼んでいる;
    • 6.1 履歴保存省略.6.2 粒子遷移movesetのDoMoveで遷移する.例では6.3 重みの規格化※ここで重みの規格化が行われている.6.4 ESSの計算とリサンプリング文字通り.6.5 MCMCステップ6.6 時刻Tを1つ増やす文字通り.6.7 ESSを返す文字通り.7. Output量の計算
    • 被積分関数を定義しておき, sampler.Integrateで計算する.SMCTC: Sequential Monte Carlo template Classhttp://www2.warwick.ac.uk/fac/sci/statistics/staff/academic-research/johansen/smctcマニュアルメモhttp://www.jstatsoft.org/v30/i06/paper4. The SMCTC Library4.1. Library and program structuresmc::sampler : ライブラリのアルゴリズム全体に対応するものsmc::particle : 個別の粒子の値と重みを保持するものsmc::history : 前回のiterationの後のsamplerの状態を表すものsmc::historyelement : 前回のsamplerの状態を保持するためにhistoryによって用いられるものsmc::historyflags : samplerの履歴に関する簡単な情報を保持するためのもの. 現状ではリサンプリングを行ったかどうかを保持することに用いられている.smc::moveset : 粒子の初期化, 提案分布, 追加的なMCMCによる変化を扱うsmc:rng : GSL random number facilitiesに対するラッパー. 現状では一部の機能のみ対応. 直接GSLの機能を利用することも可能.smc:gslrnginfo : GSL 乱数生成機に関する情報を扱うsmc::exception : 例外処理に用いるものSMCTCを用いたSequential Monte Carloで実行される手続きの概要.- 初期化smc::sampler が利用可能になる前に, samplerが行うこととSMCアルゴリズムのパラメータを指定する必要がある.- 繰り返し
    • smc::sampler が生成された後は完了もしくは結果が得られるまで繰り返す- 出力samplerそのものと粒子セットに基づく何らかの期待値を出力する4.2. Creating, configuring and running a sampler: smc::samplerまずは新しいsamplerオブジェクトを作成する. 粒子数を指定する必要がある(粒子数は固定).smc::samplerのコンストラクタの引数は基本的には2つ. 粒子数と, samplerの履歴(各繰り返しにおいて生成される粒子セット)保持メモリ容量を指定する値(SMC_HISTORY_RAM or SMC_HISTORY_NONE)である. NONEの方を指定すると直近に生成された粒子セットのみを保持する. smc::samplerはテンプレートクラスなので型を指定する必要がある. ここでの型はクラスもしくはC++のデータ型のことであり, 状態空間の点を表すものである.状態空間が1次元の実数全体, 1000粒子, 履歴保持なしのsamplerをコンストラクトするなら,smc::sampler<double> Sampler(1000, SMC_HISTORY_NONE);同様に, 状態空間がn次元の実数全体, 1000粒子, 履歴有りならsmc::sampler<std::vector<double> > Sampler(1000, SMC_HISTORY_RAM);とする.提案分布と重み(Proposals and importance weights)粒子の遷移と重み付けを担う関数はsmc::movesetを経由してsmc::samplerに引き渡す.movesetはsamplerに対してSetMoveSetメンバ関数で提供される. このmovesetは事前に初期化されていなければならない.Section 4.3参照.リサンプリング(Resampling)幾つかのリサンプリング方法が指定できる. 常にリサンプリングする, しない, ESSが指定された閾値を下回るときリサンプリングするのいずれかである. SetResampleParams(ResampleType, double)によって設定する. ResampleTypeはenumerationであり, 次の表から選ぶ.2つめのdoubleの値が負の場合はリサンプリングしない.[0,1]の間の場合は, ESSの全粒子数に対する割合がその値を下回るときに,1より大きい場合は, ESSがその値より小さい場合に, リサンプリングする. 全粒子数より大きい値を設定すれば, 常にリサンプリングすることになる.MCMCによる散らし(MCMC Diversification)リサンプリングの後にMCMCによる遷移が適用出来る. 適切に設定されたmovesetをsamplerに渡すことで自動的に実行可能である. Section5.2 参照.アルゴリズムの実行(Running the algorithm)粒子セットの初期化を実行するsmc::samplerのInitialize(). これは履歴を消去し, 全粒子に一度ずつmovesetに設定された関数を実行することで初期化する. 初期化が済めば繰り返し処理を行う. Iterate()とIterateUntil(int)の2通りがある.出力(Output)粒子セットに基づく経験測度に関する積分が実行可能である. 粒子セットの位置と重みも取得できる.- Simple integrationdouble integrand(const T& , void *)where T denotes the type of the smc::sampler template class in use.Sampler.Integrate(integrand, void *(p));where p is a pointer to auxiliary information that is passed directly to the integrand functionvia its second argument { this may be safely set to NULL if no such information is requiredby the function.例5.1に説明有り.- Path-sampling integrationhttp://www.cis.upenn.edu/~taskar/courses/cis700-sp08/papers/gelman-meng.pdf省略しておく.
    • - General outputFor more general tasks it is possible to access the locations and weights of the particles directly.Three low-level member functions provide access to the current generation of particles, eachtakes a single integer argument corresponding to a particle index.GetParticleValue(int n)GetParticleLogWeight(int n)GetParticleWeight(int n)n番目の粒子に対する, 値の参照, 規格化されていない対数重み, 規格化されていない重みをそれぞれ返す.smc::sampler の GetHistory() も使えるが, 詳しくはmanualをみる.Finally, a human-readable summary of the state of the particle system can be directed to anoutput stream using the usual << operator4.3. Specifying proposals and importance weights: smc::moveset- Initializing the particlessamplerが保持する粒子の初期化関数 smc::particle<T> fInitialise(smc::rng *pRng); T: samplerの型particleのコンストラクタ smc::particle<T> (value, dLogWeight)- Moving and weighting the particles提案分布 void fMove(long, smc::particle<T> &, smc::rng *) samplerが呼ぶ時, 1番目のlongは現在の繰り返し番号に設定される-- Changing the valueGetValue() and SetValue(T)GetValuePointer()-- Updating the weightGetWeight(): 規格化されていない重みGetLogWeight()SetWeight(double)SetLogWeight(double)AddToLogWeight(double)MultiplyWeightBy(double)※粒子の重み更新において, AddToLogWeightを用いた例がRcppSMCにある. 意味的にSetLogWeightでないのか? 要確認 粒子の重みの更新方法について確認する. 規格化はsampler<space>のiterateEssの中でやっている.- Mixtures of moves複数のtransition kernelを用いる.For example, if the sampler is of type T and fMv1 and fMv2 each correspond to a valid move function then the followingcode would produce an array of the appropriate type named pfMoves which contains pointers to these two functions:void (*pfMoves[])(long, smc::particle<T> &,smc::rng*) = {fMv1, fMv2};long fSelect(long lTime, const smc::particle<T> & p, smc::rng *pRng)- Additional MCMC movesIf MCMC moves are required then one should simply produce an additional move function with an almost identical prototype to that used forproposal moves. The one difference is that normal proposals have a void return type, whilst the MCMC move function should return int. Thefunction should return zero if a move is rejected and a positive value if it is accepted.- Creating an smc::moveset object-- Single-proposal movesetsmoveset ( particle<T>(*pfInit)(rng *),void(*pfNewMoves)(long, particle<T> &, rng *),int(*pfNewMCMC)(long, particle<T> &, rng *))optionally, a pointer to an MCMC move function (if one is not required, then the argumentspecifying this function should be set to NULL)-- Mixture-proposal movesetsmoveset ( particle<T>(*pfInit)(rng *),long(*pfMoveSelector)(long, const particle<T> &, rng *),long nMoves,void(**pfNewMoves)(long, particle<T> &, rng *),int(*pfNewMCMC)(long, particle<T> &, rng *))参照:5.2節-- Using a movesetsamplerのSetMoveSetで設定する.
    • 4.4. Error handling: smc::exceptionconst char* szFile;long lLine;long lCode;const char* szMessage;参照:5.1節4.5. Random number generation特に気にしなくて良いはずであるが, 必要ならマニュアルを見る.GSL_RNG_SEEDGSL_RNG_TYPE参照:5.1節5.1節の例では適当なディレクトリでBASH promptにおいてGSL_RNG_TYPE=ranlux GSL_RNG_SEED=36532673278 ./pfという設定値を用いている.5. Examples applicationsa simple particle fillter in Section 5.1 anda more involved SMC sampler which estimates rare event probabilities in Section 5.2.5.1. A simple particle filterThe almost constant velocity model in the tracking literature.2次元粒子の運動.位置のみ不完全だが測定可能(=誤差含む), 速度は測定できない, 測定は離散時間