メトロポリス輸送の事始め
前から双方向パストレーシングを理解したいと思ってたんだけど、視点からのパスとライトからの パスの結びつけるときのウェイトの与え方がわからなくて、なんかいい資料がないかとさまよっていた ところ、双方向パストレーシングとは違うんだけどメトロポリス光輸送の論文が引っかかった。
A Practical Introduction to Metropolis Light Transport
手を動かしながら読み進めていきたい。
1章は導入だけなので、2章から。
2 Metropolis Transport
2章のタイトルは「メトロポリス輸送」とのことで、まず何をやりたいのかを語る:
- 関数 f を近似したいとして、
- f に比例するサンプリング分布を生成し、その分布から 得られるサンプルのヒストグラムを作る
- 結果のヒストグラムは f に比例する(当然)
- f を近似するようにヒストグラムをスケール
f に比例するサンプリング分布が作れるという前提からして、ちょっと何言ってるのかわからない ですなんだけど、メトロポリス輸送 はこの方法を使って関数を近似する、ということらしい。
2.1 Creating a Sampling Distribution
- メトロポリスアルゴリズムは詳細釣り合い というアイディアで、f に比例する分布を作り出す
で、その後詳細釣り合いについてあれこれ書かれているんだけど、なにを書いているのか さっぱりわからず…。
- すでに f に比例するヒストグラムが存在するとして
- あるビンから他のビンに流れ出す量が戻る量と同じなら 定常分布 が保たれる (これを 詳細釣り合い という)
なんちゃらかんちゃら…
遷移関数を定義する
- 関数 K は 暫定遷移関数 T (または 変異戦略 と呼ばれる)を使って定義される
- は、現在のサンプル位置 から次のサンプル位置の提案として が選ばれる 確率
- 確率 で から へ遷移し、 で に留まる
- 図2の
makeHistogram
関数はメトロポリス輸送を使って画像をコピーする - すごく単純な変異戦略で、一様確率で画像のランダム位置を選ぶ
- しかし幅広い遷移関数が使える、後でMLTの力はいい変異戦略を選ぶことに依ることを見る
でCのプログラムが載っている。こいつをProcessingで動かせるようにするために、 Javaに書き直してみる:
void makeHistogram(int w, int h, float[] F, float[] histogram, int mutations) { |
これに画像を読み込んで各ピクセルの明るさから目的の関数F
の配列を生成して、
関数makeHistogram
を呼び出して得られたhistogram
を描画するプログラムを書いてやる:
int randomInteger(int min, int max) { |
デモ
僕の頭では説明を読んだだけではわからなかったけど、プログラムを動かしてみるとなんとなく動作が 理解できた。これによると、
- 暗い点から同じ明るさまたは明るい点には100%遷移する(
Axy
が1になるので) - 逆に明るい点から暗い点には、その明るさの比によって確率で遷移するかしないか決まる
この規則で、なんで f に比例する分布が得られるのかさっぱりわからないんだけど、 動かした結果は確かにそれっぽい。不思議。