PDF 形式のマニュアルはダウンロードページからダウンロードできます。

1. はじめに

本書は、「Monte Carlo Dynamic Classifier ツール開発および実験支援作業」において作成したプログラムの実行手順を説明するものです。 Monte Carlo Dynamic Classifier ツールは、任意の観測データ系列のモデル推定、およびその推定モデルによる状態系列の推定を行うプログラムです。 推定されたモデルは、異なる観測データ系列に適用してモデルの尤度を計算することにより、観測データ系列のクラス分類などに応用できます。

MCDC ツールは、以下のプログラム群から構成されます。

MCDCTrain
モデル推定プログラム
MCDCTest
モデルの尤度計算プログラム
Graphs
推定されたモデルのグラフ描画関数群

本書の以下の各章では、これらのプログラムの実行方法と実行例プログラム構成 について説明します。
また、本ツールに付属するサンプルプログラムの一部では、 CMU Graphics Lab Motion Capture Database にて公開されているモーションキャプチャデータを利用します。 このデータの利用許諾条件についてライセンスに記載します。

2. プログラムの実行

MCDC ツールでは、観測データ系列に対してモデル推定を行う MCDCTrain と、推定モデルを用いて未知の観測データ系列の状態系列の推定を行う MCDCTest が提供されます。 このほかに、推定モデルをグラフ描画する関数群を集めたツールとして Graphs クラスが提供されます。本章ではこれらのプログラムの実行方法について説明します。

2.1. MCDCTrain 関数

MCDCTrain 関数は、観測データ系列に対してモデル推定を行うプログラムです。以下のように実行します。

[ IDX, SKP, OKP, FV, GV, XE, YE, loglik ] = MCDCTrain( ...
  algorithm, ...
  grids, ...
  stateKernelGens, ...
  obsKernelGens, ...
  stateMeanFuncs, ...
  obsMeanFuncs, ...
  gridDimForGM, ...
  splineHandle, ...
  x0, ...
  xaux, ...
  u, ...
  y', ...
  N, ...
  J, ...
  K, ...
  aspect ...
);

また、以前の実行で出力されたファイルを読み込み、反復実行を継続することもできます。この場合は MCDCTrain 関数を以下のように実行します。 継続実行の際には、指定された matfile からパラメータを読み込み、前回と同じ設定で実行を再開します。ただし、 Name, Value の組を指定することで、前回の設定を上書きして実行できます。

[IDX, SKP, OKP, FV, GV, XE, YE, loglik] = MCDCTrain(matfile, aspect, Name, Value. ...)

MCDCTrain 関数のパラメータは以下のとおりです。
パラメータ データ型 内容
algorithm Algorithm アルゴリズム種別
xGrids G double[] cell 状態空間上に構成される格子点の座標。各次元の値を double 配列として格納したセル配列として表す
stateKernelGens Dx handle cell 状態遷移関数のカーネル事前分布。 Dx は状態空間のうち推定対象とされる次元数とする
obsKernelGens P handle cell 観測関数のカーネル事前分布
gridDimForGramMatrix int グラム行列作成に用いる次元
splineHandle handle スプライン補間に用いるアルゴリズム。現在は GenericSpline のハンドルに固定
x0 Dx*1 double 状態変数の初期状態
xaux Da*T double 追加状態データ
u D*T double 制御データ
z P*T double 観測データ
N int Particle filter 実行時の粒子数
J int MCMC iteration の全体の反復回数
K int 観測オフセット
aspect Aspect システム設定情報 (ログ出力先等)

algorithm パラメータには、以下のいずれかのクラスを選択できます。
クラス名 アルゴリズム内容
PSMC 状態遷移関数と観測関数をガウス過程からのランダムサンプリングで生成する。パラメータ推定は行わない
PMCMC 状態遷移関数と観測関数をガウス過程からのランダムサンプリングで生成する。パラメータ推定に Particle marginal Metropolis-Hastings 法を用いる
PMCMC2 状態遷移関数と観測関数をガウス過程からのランダムサンプリングで生成する。パラメータ推定に Particle marginal Metropolis-Hastings 法を用いる。状態空間の特定の一次元のみを共分散関数に用いる

アルゴリズムとして PMCMC2 を利用する場合には、さらに、平均値関数と共分散関数の学習方式、共分散関数に用いるカーネルパラメータの学習方式を以下から選択できます。
クラス名 アルゴリズム内容
MCDCStrategyChoice1 平均値関数を学習せず、常にアンカーモデルを利用する。共分散関数にカーネル関数を用いる
MCDCStrategyChoice2 現在の GP surface を平均値関数として関数をサンプリングする。共分散関数にカーネル関数を用いる
MCDCStrategyChoice3 現在の GP surface を平均値関数として関数をサンプリングする。共分散関数にカーネル関数を用いず、固定された共分散行列を用いる
RBFKernelGeneratorStrategyChoice1 RBF カーネルのカーネルパラメータを事前分布からランダムサンプリングする
RBFKernelGeneratorStrategyChoice2 RBF カーネルのカーネルパラメータを現在値からのランダムウォークによって生成する

MCDCTrain 関数の実行結果として戻される値は、以下のとおりです。
データ型 内容
IDX J*1 double j 回目の反復までの累積受理回数
SKP A*D*2 double 第 a 受理反復 における、状態遷移関数のカーネルパラメータ (sigma, l)
OKP A*P*2 double 第 a 受理反復における、観測関数のカーネルパラメータ (sigma, l)
FV A*D*G double 第 a 受理反復における、状態遷移関数による格子点上の値。 G は格子点のサイズに一致する多次元配列
GV A*P*G double 第 a 受理反復における、観測関数による格子点上の値。 G は格子点のサイズに一致する多次元配列
XE A*T*D double 第 a 受理反復における、時刻 t の状態変数の推定平均
YE A*T*P double 第 a 受理反復における、時刻 t の観測変数の推定平均
loglik A*1 double 第 a 受理反復における、 particle filter による推定の対数尤度

実行時には、 aspect の設定にしたがって中間状態が保存されます。これは .mat 形式のダンプファイルとして出力されます。ファイルに格納されているデータは以下のとおりです。
データ型 内容
algorithm Algorithm MCDCTrain のパラメータに渡された algorithm
in MCDCInput MCDCTrain のパラメータのうち、 algorithm と aspect を除くすべて
out MCDCOutput MCDCTrain の戻り値のすべて (途中状態) および、現在の反復回数 j

実行中には、 aspect の設定にしたがってログファイルが出力されます。これはテキスト形式のファイルになります。ログファイルは以下のような形式になります。

2014/04/26 11:29:36 - Iteration 18 / 200
2014/04/26 11:29:36 -   StateKernel[1]: [ Sigma=8.932992, L=7.409991 ]
2014/04/26 11:29:36 -   StateKernel[2]: [ Sigma=4.410584, L=2.304895 ]
2014/04/26 11:29:36 -   ObsKernel[1]: [ Sigma=1.711191, L=9.248074 ]
2014/04/26 11:29:36 -   ObsKernel[2]: [ Sigma=9.867704, L=9.599577 ]
2014/04/26 11:29:36 -   ObsKernel[3]: [ Sigma=7.700470, L=8.679293 ]
2014/04/26 11:29:36 -   Creating GramMatrix using 1 dim...
2014/04/26 11:29:36 -     StateKernel[1] Done
2014/04/26 11:29:36 -     StateKernel[2] Done
2014/04/26 11:29:36 -     ObsKernel[1] Done
2014/04/26 11:29:36 -     ObsKernel[2] Done
2014/04/26 11:29:36 -     ObsKernel[3] Done
2014/04/26 11:29:36 -   Drawing GP surface...
2014/04/26 11:29:36 -   Estimating using particle filter... (N=500)
2014/04/26 11:30:20 -   Acceptance log probability = 232745.510426
2014/04/26 11:30:20 -   logLH = -5347068.232758, accepted
2014/04/26 11:30:20 - Elapsed time is 44.324939 seconds.
2014/04/26 11:30:20 -   j: 8 bytes
2014/04/26 11:30:20 -   IDX: 1600 bytes
2014/04/26 11:30:20 -   SKP: 128 bytes
2014/04/26 11:30:20 -   OKP: 192 bytes
2014/04/26 11:30:20 -   FV: 61504 bytes
2014/04/26 11:30:20 -   GV: 92256 bytes
2014/04/26 11:30:20 -   XE: 122752 bytes
2014/04/26 11:30:20 -   YE: 184128 bytes
2014/04/26 11:30:20 -   loglik: 32 bytes

2.2. MCDCTest 関数

MCDCTest 関数は、 MCDCTrain によって得られたモデルを用いて未知のデータの状態を推定します。複数の異なるモデルを用いて状態推定を行い、それぞれの尤度を比較することで、クラス分 類問題への応用も可能です。以下のように実行します。

[ result, FnState, FnObs ] = MCDCTest(u, y, N, modelFile)

MCDCTest 関数のパラメータは以下のとおりです。
パラメータ データ型 内容
u D*T double 制御データ
y P*T double 観測データ
N int Particle filter 実行時の粒子数
modelFile chars モデルファイル

MCDCTest 関数の実行結果として戻される値は、以下のとおりです。
データ型 内容
result ParticleFilter j 回目の反復までの累積受理回数
FnState handle 状態遷移関数
FnObs handle 観測関数

戻り値の result に、 particle filter による状態推定の結果が含まれます。これは以下の構造を持ちます。
データ型 内容
Particles N*T*D double 時刻 t における各粒子の座標
Weights N*T double 時刻 t における各粒子の重み
Loglik double 推定された状態の対数尤度

2.3. Graphs

MCDCTrain によって推定されたモデルは、 Graph クラスに定義された関数群を用いて PDF ファイルに出力することができます。以下のグラフを出力可能です。

2.3.1. Graphs.YE

観測データ系列と、推定モデルを用いた粒子フィルタによって観測データを追跡した結果の時間推移グラフを出力します。 MCMC iteration の中で、指定された特定の反復における推定モデルを用いた結果を出力します。観測データ系列の次元ごとにグラフが出力されます。 以下のように実行します。

Graphs.YE( ...
  outputFileNamePrefix, ...
  matFileName, ...
  iterations, ...
  times ...
);

パラメータは以下のとおりです。
パラメータ データ型 内容
outputFileNamePrefix char[] 出力グラフファイルのファイル名接頭辞。ファイル名は、指定された接頭辞に、次元数と拡張子 .pdf を付け加えたものになります
matFileName char[] 推定モデルを含む Matlab データファイル名
iterations int[] プロットする推定値の MCMC iteration を列挙した配列
times int[] プロットするデータ系列の範囲。省略時はデータ系列の全体を出力します

2.3.2. Graphs.XE

推定モデルを用いた粒子フィルタによる状態系列推定値の時間推移グラフを出力します。 MCMC iteration の中で、指定された特定の反復における推定モデルを用いた結果を出力します。状態系列の次元ごとにグラフが出力されます。 以下のように実行します。

Graphs.XE( ...
  outputFileNamePrefix, ...
  matFileName, ...
  iterations, ...
  times ...
);

パラメータは以下のとおりです。
パラメータ データ型 内容
outputFileNamePrefix char[] 出力グラフファイルのファイル名接頭辞。ファイル名は、指定された接頭辞に、次元数と拡張子 .pdf を付け加えたものになります
matFileName char[] 推定モデルを含む Matlab データファイル名
iterations int[] プロットする推定値の MCMC iteration を列挙した配列
times int[] プロットするデータ系列の範囲。省略時はデータ系列の全体を出力します

2.3.3. Graphs.YEMean

観測データ系列と、推定モデルを用いた粒子フィルタによって観測データを追跡した結果の時間推移グラフを出力します。 MCMC iteration の全体を平均した推定モデルを用います。観測データ系列の次元ごとにグラフが出力されます。 以下のように実行します。

Graphs.YEMean( ...
  outputFileNamePrefix, ...
  matFileName, ...
  times ...
);

パラメータは以下のとおりです。
パラメータ データ型 内容
outputFileNamePrefix char[] 出力グラフファイルのファイル名接頭辞。ファイル名は、指定された接頭辞に、次元数と拡張子 .pdf を付け加えたものになります
matFileName char[] 推定モデルを含む Matlab データファイル名
times int[] プロットするデータ系列の範囲。省略時はデータ系列の全体を出力します

2.3.4. Graphs.XEMean

推定モデルを用いた粒子フィルタによる状態系列推定値の時間推移グラフを出力します。 MCMC iteration の全体を平均した推定モデルを用います。状態系列の次元ごとにグラフが出力されます。 以下のように実行します。

Graphs.XEMean( ...
  outputFileNamePrefix, ...
  matFileName, ...
  times ...
);

パラメータは以下のとおりです。
パラメータ データ型 内容
outputFileNamePrefix char[] 出力グラフファイルのファイル名接頭辞。ファイル名は、指定された接頭辞に、次元数と拡張子 .pdf を付け加えたものになります
matFileName char[] 推定モデルを含む Matlab データファイル名
times int[] プロットするデータ系列の範囲。省略時はデータ系列の全体を出力します

2.3.5. Graphs.Loglik

モデル推定において、 MCMC iteration ごとに推定されたモデルの対数尤度を出力します。以下のように実行します。

Graphs.Loglik( ...
  outputFileNamePrefix, ...
  matFileName1, ...
  matFileName2, ...
  ...
);

パラメータは以下のとおりです。
パラメータ データ型 内容
outputFileNamePrefix char[] 出力グラフファイルのファイル名接頭辞。ファイル名は、指定された接頭辞に .pdf を付け加えたものになります
matFileName1, 2, ... char[] 推定モデルを含む Matlab データファイル名。複数ファイルを指定した場合は、それぞれを一系列としてグラフを描画します

2.3.6. Graphs.Rmse

モデル推定において、各 MCMC iteration までの推定モデルを用いて観測データ系列を推定した結果の平均二乗誤差を出力します。以下のように実行します。

Graphs.Rmse( ...
  outputFileNamePrefix, ...
  matFileName ...
);

パラメータは以下のとおりです。
パラメータ データ型 内容
outputFileNamePrefix char[] 出力グラフファイルのファイル名接頭辞。ファイル名は、指定された接頭辞に .pdf を付け加えたものになります
matFileName char[] 推定モデルを含む Matlab データファイル名

2.4. プログラム実行例

MCDCTrain によるモデル推定の実行例として、Kitagawa モデルから生成した観測データ系列の推定を行う例を示します。 以下のコード例は、 samples/KitagawaModelPMCMCEstimation2.m に含まれます。

まず、モデル推定の対象とする観測データを用意します。 本来、観測データは事前に与えられるものですが、ここでは Kitagawa モデルから生成したデータ系列を観測データとして利用します。

[x, y] = KitagawaModel(1000, 0.5, 28, 8, 0.6, 30, 10, 0.05, 0.06, 0.07, 0.08, 0.1, 0.1);
u  = repmat(cos(1.2 * [1:T]), 2, 1)';

このコードにより、y に観測データ系列が格納されます。x には状態の系列が格納されますが、x はこの後の処理では利用しません。 また、Kitagawa モデルでは、時変の制御データを与えるため、観測データの生成に合わせて、制御データ系列もここで生成しています。

MCDCTrain は、状態空間モデルを未知としてモデル推定を行います。 現在のプログラムでは、状態空間の次元数、状態変数の値が動く範囲を与える必要があります。 以下では、二次元の状態空間を考え、各次元について -30 から 30 の範囲で 2.0 刻みの格子点を設定します。

grids = { ...
  [-30:2:30], ...
  [-30:2:30]  ...
};

モデル推定の処理では、ここで設定された格子点上でガウス過程から関数の値をサンプリングし、それをスプライ ン補間することで状態遷移関数、観測関数を作ります。 格子点をより多く、より広範に取ることでモデルの表現力は高くなりますが、処理時間、メモリ使用量が大幅に増えることになります。

次に、状態遷移関数、観測関数のモデルをデザインします。 MCDCTrain では、状態遷移関数と観測関数のそれぞれについて、ガウス過程から関数をサンプリングする際の平均値関数、カーネル共分散行列を与えることができます。

stateKernelGens = { ...
  RBFKernelGenerator(UniformDistribution(0.01, 10), UniformDistribution(0.01, 10)), ...
  RBFKernelGenerator(UniformDistribution(0.01, 10), UniformDistribution(0.01, 10))  ...
};

obsKernelGens = {
  RBFKernelGenerator(UniformDistribution(0.01, 10), UniformDistribution(0.01, 10)), ...
  RBFKernelGenerator(UniformDistribution(0.01, 10), UniformDistribution(0.01, 10)), ...
  RBFKernelGenerator(UniformDistribution(0.01, 10), UniformDistribution(0.01, 10))  ...
};

stateMeanFuncs = { ...
  @(x) (a1 .* x(1,:) + b1 .* x(1,:) / (1 + x(1,:) .^ 2)), ...
  @(x) (a2 .* x(2,:) + b2 .* x(2,:) / (1 + x(2,:) .^ 2))  ...
};

obsMeanFuncs = { ...
  @(x) (d1 .* x(1,:) .^ 2 + d2 .* x(2,:) .^ 2), ...
  @(x) (d3 .* x(1,:) .^ 2                    ), ...
  @(x) (                    d4 .* x(2,:) .^ 2)  ...
};

上記のコード例では、パラメータσ、l がともに [0.01, 10] の一様分布に従う RBF カーネルを用い、平均値関数には Kitagawa モデルの状態遷移関数、観測関数を設定しています。(一般的には、真のモデルが未知であるため、平均値関数として真のモデルを設定することはできませ ん。)

MCDCTrain の MCMC iteration で利用するアルゴリズムを選択します。カーネルパラメータ、平均値関数を事前分布に固定するか、毎回遷移させるかを選択できます。

kernelGeneratorStrategy = @RBFKernelGeneratorStrategyChoice2;
mcdcStrategy = @MCDCStrategyChoice2;
algorithm = PMCMC2(kernelGeneratorStrategy, mcdcStrategy);
gridDimForGramMatrix = 1;
splineHandle = @GenericSpline;

モデル推定の反復回数、粒子数、また、ログファイルの出力先等の設定を行います。

x0 = zeros(1, 2);
N  = 500;
J  = 100000;

aspect = Aspect();
aspect.LogFileName = 'logs/KitagawaModelPMCMC2.log';
aspect.MatFileNamePrefix = 'logs/KitagawaModelPMCMC2';
aspect.SavesIntermediateMat = true;
aspect.IntermediateMatInterval = 100;

ここまでの設定を用いて、 MCDCTrain によるモデル推定を実行します。

[ IDX, SKP, OKP, FV, GV, XE, YE, loglik ] = MCDCTrain( ...
  algorithm, …
  grids, ...
  stateKernelGens, ...
  obsKernelGens, ...
  stateMeanFuncs, ...
  obsMeanFuncs, ...
  gridDimForGramMatrix, ...
  splineHandle, ...
  x0, ...
  [], ... % No auxiliary states
  u', ...
  y', ...
  N, ...
  J, ...
  0, ...
  aspect ...
);

3. プログラム構成

MCDC ツールは、 Matlab のプログラムとして作成されています。プログラムファイルの一覧は以下のとおりです。
ファイル名 内容
Algorithm.m モデル推定に用いるアルゴリズムを表す抽象基底クラス
Aspect.m プログラム動作を定める設定クラス
BoundedNormalDistribution.m 正の範囲に限定された正規分布
CheckGridTransformation.m グリッドの写像に対する範囲チェック関数
Distribution.m 確率分布を表す抽象基底クラス
PSMC.m モデル推定アルゴリズム。状態遷移関数と観測関数をガウス過程からのランダムサンプリング で生成する。パラメータ推定は行わない
GPSurface.m グリッドの写像を求める関数
GenericSpline.m 多次元スプライン補間関数。 spapi 関数を用いる
Graphs.m グラフ描画関数群
GridData.m 状態空間におけるグリッド構造
Kernel.m カーネル関数 (抽象基底クラス)
KernelGenerator.m カーネル関数生成器 (抽象基底クラス)
LogMvnPdf.m 多変量正規分布の確率密度関数の計算
MCDCInput.m モデル推定の入力データ
MCDCMatFile.m モデル推定の中間ファイル出力クラス
MCDCOutput.m モデル推定の出力結果
MCDCStrategy.m MCMC の動作を定める抽象基底クラス
MCDCStrategyChoice1.m MCMC の動作を定めるクラス。平均値関数を学習せず、常にアンカーモデルを利用する
MCDCStrategyChoice1_PSMC.m MCMC の動作を定めるクラス。平均値関数を学習せず、常にアンカーモデルを利用する
MCDCStrategyChoice2.m MCMC の動作を定めるクラス。現在の GP surface を平均値関数として関数をサンプリングする。
MCDCStrategyChoice3.m MCMC の動作を定めるクラス。現在の GP surface を平均値関数として関数をサンプリングする。共分散関数を学習せず、固定された共分散行列を用いる
MCDCTest.m 推定モデルの尤度計算プログラム
MCDCTrain.m モデル推定プログラム
ModelFunctions.m グリッドの写像に対するスプライン関数
ModelFunctions2.m グリッドの写像に対するスプライン関数
NormalDistribution.m 正規分布
PMCMC.m モデル推定アルゴリズム。状態遷移関数と観測関数をガウス過程からのランダムサンプリング で生成する。パラメータ推定に Particle marginal Metropolis-Hastings 法を用いる
PMCMC2.m モデル推定アルゴリズム。状態遷移関数と観測関数をガウス過程からのランダムサンプリング で生成する。パラメータ推定に Particle marginal Metropolis-Hastings 法を用いる。状態空間の特定の一次元のみを共分散関数に用いる
PMCMCParticleFilter.m 粒子フィルタ。 PMCMC 法で利用するために Ancestor sampling を行う
ParticleFilter.m 粒子フィルタ
PlotGraph.m グラフ描画サブルーチン。 Graphs.m から利用される
RBFKernel.m RBF カーネル。ガウス過程の共分散関数として利用する
RBFKernelGenerator.m RBF カーネル関数生成器
RBFKernelGeneratorStrategy.m RBF カーネル関数の生成方法を定める抽象基底クラス
RBFKernelGeneratorStrategyChoice1.m RBF カーネル関数生成アルゴリズム。カーネルパラメータを事前分布からランダムサンプリングする
RBFKernelGeneratorStrategyChoice2.m RBF カーネル関数生成アルゴリズム。カーネルパラメータを現在値からのランダムウォークによって生成する
UniformDistribution.m 一様分布
VectorValuedFunction.m 各次元のスカラー値関数をベクトル値関数にまとめるルーチン

また、 samples ディレクトリ以下には、サンプルデータに対して MCDC ツールを用いてモデル推定、判別実験を行うためのプログラムファイルが含まれています。 samples ディレクトリに含まれるファイルの一覧は以下のとおりです。
ファイル名 内容
KitagawaModel.m Kitagawa モデルによる時系列生成関数
KitagawaModelPSMCEstimation.m Kitagawa モデル推定実験プログラム(PSMC アルゴリズムを利用)
KitagawaModelPMCMC2Estimation.m Kitagawa モデル推定実験プログラム(PMCMC2 アルゴリズムを利用)
KitagawaModelPMCMCEstimation.m Kitagawa モデル推定実験プログラム(PMCMC アルゴリズムを利用)
KitagawaModel_WriteGraphs.m Kitagawa モデル推定結果描画プログラム
LinearStateSpaceModel.m 線形状態空間モデルによる時系列生成関数
LinearStateSpaceModelPSMCEstimation.m 線形状態空間モデル推定実験プログラム(PSMC アルゴリズムを利用)
LinearStateSpaceModelPMCMC2Estimation.m 線形状態空間モデル推定実験プログラム(PMCMC2 アルゴリズムを利用)
LinearStateSpaceModelPMCMCEstimation.m 線形状態空間モデル推定実験プログラム(PMCMC アルゴリズムを利用)
LorenzModel.m Lorenz モデルによる時系列生成関数
LorenzModelPSMCEstimation.m Lorenz モデル推定実験プログラム(PSMC アルゴリズムを利用)
LorenzModelPMCMC2Estimation.m Lorenz モデル推定実験プログラム(PMCMC2 アルゴリズムを利用)
LorenzModelPMCMCEstimation.m Lorenz モデル推定実験プログラム(PMCMC アルゴリズムを利用)
LorenzModel_WriteGraphs.m Lorenz モデル推定結果描画プログラム
MotionCapture.m MotionCapture データからの時系列データ生成関数
MotionCapturePMCMC2Estimation.m MotionCapture モデル推定実験プログラム(PMCMC2 アルゴリズムを利用)
MotionCapturePMCMC2Test.m MotionCapture クラス分類実験プログラム
MotionCapture_WriteGraphs.m MotionCapture モデル推定結果描画プログラム
amc_to_matrix.m AMC ファイルから Matlab 行列形式への変換関数