MATLAB LiveScriptで報告書作成
MATLAB LiveScriptとは
ソースコードと説明用の式や図をInteractiveに表示するMATLABの新たな表示形式です。
以下がMATLAB公式の説明。
ライブ スクリプトとは - MATLAB & Simulink - MathWorks 日本
Pythonをやる人にはjupyterみたいなもんといえばわかるでしょうか。
MATLABをjupyterで使うということもできますがPython環境を準備したりが面倒でしたよね。
なお,公式には2016aから対応しているとのこと。
持ってない人は買いましょう。学生は一万円くらいで2ライセンス買えます。(生協・Amazonからの購入。生協にあるなら生協の方が安いかと。)
MATLAB and Simulink Student Suite R2018a
- 出版社/メーカー: MathWorks
- メディア: DVD-ROM
- この商品を含むブログを見る
MATLAB2018のStudent版はDeep Learningを含む機械学習等にも力を入れているので以前のバージョンを持っている人も試してみると良いかもしれません。
先人の調査所感
なお,興味深い調査所感が以下にあります。実行速度が半分になる可能性があるのはたしかに厄介なのと,図を含めたファイルサイズが今の所の懸念点というのは有益な情報でした。
qiita.com
実際に書いてみよう
Jupyterのような使い方をわかっている前提で書きますが,要はテキスト用の箇所とコードを記述する用の箇所を切り替えているだけなのではじめての人でもすぐ馴染めると思います。
ファイルの作成
ライブスクリプトの拡張子は
Control+Nで作成し保存時に拡張子を指定するか,GUIメニューでライブスクリプトを選択すれば良いです。
なお,「edit **.mlx」というふうにコマンドラインで実行しても作成できるそうな。
よく使うショートカット
起動してぽちぽちいじっているとコードを書くところと説明を書くところがこのように違うことがわかります。
具体的に使いそうなショートカットは
- Alt+Enter:コード/テキストの切り替え
- Ctrl+Alt+Enter : ブロックの改行。段落替え。
- Ctrl+Alt+T:標準テキスト
- Ctrl+Alt+H:見出しテキスト
- Ctrl+Alt+L:タイトルテキスト
- Ctrl + Enter
となっています。
流れの例として,
1. Alt+Enterで「テキストモードにする」
1. Ctrl+Alt+Hで「見出し」モード。見出しを書く。
1. Ctrl+Alt+Tで「本文」モード。本文を書く。
1. Alt+Enterでコードに切り替えたり,そのまま説明を書くことを繰り返す。
1. Ctrl+Enter で段落を実行。問題なければ Ctrl+Alt+Enter で段落改行。
こんな感じでしょうか?
ライブ スクリプトのセクションの実行 - MATLAB & Simulink - MathWorks 日本
図や実行結果を載せる
普段,コマンドウィンドウに出てくる実行結果や図は右側のスペースに出てきます。
図をスクリプト内に表示させたいときは[表示] タブの [レイアウト] セクションで、[インラインで出力] ボタンをクリックします。
ライブ エディターでライブ スクリプトを作成 - MATLAB & Simulink - MathWorks 日本
一応実行コードを載せときます。
% sampling ST = 0.01; % Simulation Length len = 100 time = 0:ST:ST*(len-1); figure plot(time)
数式を挿入
数式を呼び出すショートカットはこちら。「挿入」タブからも呼べます。
- Ctrl+Shift+E: 対話式数式エディタ(要はWord風)
- Ctrl+Shift+L: Latex 形式での挿入
Latex形式はマクロも難しそうだし,ちょっと不便しそうです。
流石に行列を書くめんどくささには理解を示してくれたらしく,以下のようにコマンドを呼ぶことで本家より若干簡略化して書けます。
{\bf A} = \pmatrix{a & b \cr c & d}
以前にも似たようなことをやりましたね。Jupyterならマクロを書けるんですが…
ossyaritoori.hatenablog.com
エクスポート
個人メモではここまでで十分ですがこれを誰かと共有する際にはできるだけ文章形式で出力したいです。
ライブ スクリプトの共有 - MATLAB & Simulink - MathWorks 日本
Keras & Tensorflow (GPU有)の環境構築 on Windows with Anaconda
GPU付きのPC買ったので試したくなりますよね。
ossyaritoori.hatenablog.com
事前準備
- ハードウェア要求
Geforceを積んでいる高性能なPCを持っていること。
深層学習、特にCNNはかなり時間がかかります。
入れるもの
ソフトウェア間の依存関係に注意。
以下のサイトをよく確認してください。CUDAのバージョンは合っているか?CUDNNは?Pythonのは?これら全部合っていないとうまくいきません。
Installing TensorFlow on Windows | TensorFlow
具体的な環境例(2018年3月現在)
- Tensorflow1.6
- CUDA 9.0
- CUDNN 7.0
- Python3.5
これらをすべて把握している必要があります。
CUDA関係のインストール
CUDAのツールキットをダウンロード。以下は9.0のもの。間違えないように。
developer.nvidia.com
以下のpathにもろもろが入るはずです。
- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0
CUDNNのダウンロードはNVIDIAのサポートに入ることが必要。
developer.nvidia.com
ZIPを解凍した後に、 'cudnn64_7.dll' の入っているところをpathに追加します。
Pathの通っているところに当該ファイルを置いても良いかもしれませんが。
Anacondaのインストール
いつもの。こだわらないなら適当にクリックし続けていれば入ります。
www.anaconda.com
今回入れたときは、環境変数が登録されてなかったので、
「Anaconda\」と「Anaconda\Scripts」、「C:\ProgramData\Anaconda3\Library\bin」にPATHを通しておいてください。
Tensorflowのインストール
仮想環境の構築
仮想環境をたてます。AnacondaPromptからコンソールを呼んで
conda create --name=tf35 python=3.5
とします。仮想環境名は「tf35」です。次のようにして仮想環境へと入ります。
activate tf35
インストール
GPUバージョンを入れるので次のように。
公式のとちょっと違いますが、おそらく等価です。
pip install --ignore-installed --upgrade tensorflow-gpu
以下の記事を参照。
qiita.com
動作確認
pythonを起動し、次のようなプログラムを回せばいいです。
import tensorflow as tf hello = tf.constant('Hello, TensorFlow!') sess = tf.Session() print(sess.run(hello))
出会ったエラー達 Tensorflow編
CUDNNのPATHがない
動作確認時に超親切なエラー文が出てきた。
CUDNNのpathを設定するとのこと。
ImportError: Could not find 'cudnn64_7.dll'. TensorFlow requires that this DLL be installed in a directory that is named in your %PATH% environment variable. Note that installing cuDNN is a separate step from installing CUDA, and this DLL is often found in a different directory from the CUDA DLLs. You may install the necessary DLL by downloading cuDNN 7 from this URL: https://developer.nvidia.com/cudnn
CUDNNのbinをPathに加えて完了。
初回実行時?の動作
初回セッション立ち上げ時に次のような表示が出てきました。まぁ特に問題なく成功したんですが。
2018-03-27 12:11:06.853398: I C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 2018-03-27 12:11:07.976741: I C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1212] Found device 0 with properties: name: GeForce GTX 1050 major: 6 minor: 1 memoryClockRate(GHz): 1.493 pciBusID: 0000:01:00.0 totalMemory: 4.00GiB freeMemory: 3.30GiB 2018-03-27 12:11:07.976947: I C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1312] Adding visible gpu devices: 0 2018-03-27 12:14:09.136681: I C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:993] Creating TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 3033 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1050, pci bus id: 0000:01:00.0, compute capability: 6.1)
Kerasのインストール
Tensorflowをバックエンドに動くさらに高級な関数群を提供しているのがKeras。どうも本家TensorflowにもKerasの一部が移植されているようですが気にせずインストールします。
僕が試したのはこれだけ。
pip install keras
本当はAnaconda環境ならcondaで探して入れたほうがいいと思っているのですが面倒臭くなってpip使ってます。
Opencvもpipで入れて動作したしな…
<参考:CondaでOpenCVをいれるには>
ossyaritoori.hatenablog.com
MNISTのサンプルコード実行
Tensorflow編
以下の人のコードを借りました。
qiita.com
#TensorFlow Deep MNIST for Experts #https://www.tensorflow.org/get_started/mnist/pros from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data', one_hot=True) import tensorflow as tf sess = tf.InteractiveSession() x = tf.placeholder(tf.float32, shape=[None, 784]) y_ = tf.placeholder(tf.float32, shape=[None, 10]) W = tf.Variable(tf.zeros([784,10])) b = tf.Variable(tf.zeros([10])) sess.run(tf.global_variables_initializer()) y = tf.matmul(x,W) + b cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)) train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) for _ in range(1000): batch = mnist.train.next_batch(100) train_step.run(feed_dict={x: batch[0], y_: batch[1]}) correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print(accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels})) def weight_variable(shape): initial = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(initial) def bias_variable(shape): initial = tf.constant(0.1, shape=shape) return tf.Variable(initial) def conv2d(x, W): return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') def max_pool_2x2(x): return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') W_conv1 = weight_variable([5, 5, 1, 32]) b_conv1 = bias_variable([32]) x_image = tf.reshape(x, [-1,28,28,1]) h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) h_pool1 = max_pool_2x2(h_conv1) W_conv2 = weight_variable([5, 5, 32, 64]) b_conv2 = bias_variable([64]) h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) h_pool2 = max_pool_2x2(h_conv2) W_fc1 = weight_variable([7 * 7 * 64, 1024]) b_fc1 = bias_variable([1024]) h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) keep_prob = tf.placeholder(tf.float32) h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) W_fc2 = weight_variable([1024, 10]) b_fc2 = bias_variable([10]) y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2 cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv)) train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) sess.run(tf.global_variables_initializer()) for i in range(20000): batch = mnist.train.next_batch(50) if i%100 == 0: train_accuracy = accuracy.eval(feed_dict={ x:batch[0], y_: batch[1], keep_prob: 1.0}) print("step %d, training accuracy %g"%(i, train_accuracy)) train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) print("test accuracy %g"%accuracy.eval(feed_dict={ x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
実行結果はコピペ忘れたので載せませんが20000回くらい学習して99.05%の正答率だったかと。
Keras編
とりあえず、ここのコードを丸コピして性能を確認しました。
github.com
コードをサラッと読むと簡便性が理解できるでしょうか。
CNNのアルゴリズムの詳細に突っ込まないうちはKerasで遊びたいと思います。
実行結果
6万回の学習を12Epochやって以下の結果を得ました。
Test loss: 0.02737301055721746 Test accuracy: 0.9913
1epochあたり17秒くらいで3分もかからなかったという印象です。
CPUでやったときは20分位かかったので5倍は早くなっているんじゃないでしょうか。
ASUS UX550VD-7700 を買った所感とセットアップ
製品紹介
2017年秋に出たASUSから出るZenbookシリーズのある種フラグシップモデルを購入。
推しポイントは
であり、それでいてコスパはかなり良さげです。
UX550VD-7700 ロイヤルブルー ZenBook Pro UX550VD
- 出版社/メーカー: ASUSTek
- メディア: エレクトロニクス
- この商品を含むブログを見る
そして故障率などが比較的少ないASUSのブランドにも魅力を感じた結果でもあります。
VAI●とか一年に一回壊れるからな
実際の外観など
本体の大きさ15.6インチは思ったよりも大きく、重さ1.8kgの本体と大きな急速充電器の組み合わせなので持ち運びはかなり大変そうです。
薄くて広いタイプなので傷つけるのが怖く、以下のケースを購入しました。
起動後のセットアップ
つけた直後
- 音声ガイドが爆音
例のごとくCortanaによる爆音の案内が始まります。
最初の音量はなんと60%!クソうるさいので場所柄気になる方はイアホンなどを指してからやるべきかと。
- Windowsの更新が非常に長く遅い
初期セットアップの常ですがWindowsの更新確認などが非常に遅く正直最初のユーザエクスペリエンスは最悪でした。
半日は使えないと思っておいてください。
不要なソフトの削除
- ASUS GIFT
どんなアプリを押し付けてくるか若干気になりましたが普通に強制起動が煩わしいので削除です。
- Macafee関連
Macafee関連はなんかやたらとバックグラウンドで動いており、ネットでも評判が良くないので消します。
これは自分で代替のセキュリティソフトを用意できたからやったのであって、最初いきなりこれを消すこともないかもしれません。
他のASUS系のソフトはバックグラウンドで動いているわけでもないようなので無視しています。
インストールするソフト
- GoogleChrome、GoogleIME
G社のしもべなのでChromeとIMEを入れます。GoogleIMEになれると正直あまりIntelのIMEを使いたくなくなります。
あと、全角スペースを絶滅させる設定を忘れずに。
趣味と仕事用
そういえばGithubのPrivateリポジトリを申請しました。
無料でGitHubのprivateリポジトリを作る方法 - Qiita
- Texまわり
いつものこれです。
TeXインストーラ 3
TexStudioとSumatraPDFを入れてみたり。
ossyaritoori.hatenablog.com
- CUDA
CUDAですが後述の機械学習の遊びの環境の都合上、最新ではないバージョンを導入します。
Geforce1050Tiを積んでいるのでちょっとした学習程度ならこなせるのも魅力です。もちろんゲーミングにも(オーバースペックでしょうが)
機械学習の環境についてはこちらを参照
ossyaritoori.hatenablog.com
総括
カタログスペックと軽く使用した感想として総じて20万円台のPCとして十分な性能を持っています。
スタイリッシュなデザインと相まって持ち歩いてドヤ顔したい機体ですが、重さと大きさが若干ネックなので使用シーンをこれから厳選していこうかと思います。
Git cloneでPermission Denied(publickey)の対処法< SSH Keyを設定する >
jetsonのセットアップ中パッケージのCloneに困ったという記事です。
より具体的にはYOLOv2のROSバージョンを使おうとしたのですがgit cloneでPermission Deniedと喰らいました。
原因はjetsonのSSHキーを設定していなかったというだけだったのでわかっている人は見なくても良いです。
小噺:YOLO for ROSについて
YOLOと言えば2016年,2017年とCVPRにて発表されたSingleShot系の物体検知&抽出 アルゴリズムです。
開発者のサイトはこちら。
YOLO: Real-Time Object Detection
ROSでの実装ですが,私は以下のDarknetを用いてきました。
github.com
感覚的に最もpopularな実装が上のやつですが,ノードでAdvertiseするのが分類名と確率だけで複数のBoundingBoxの情報を出してくれないという不便さがあったと記憶しています。
その点,以下の実装は物体位置と確率がきちんと出力としてサポートされているので助かります。
まだまだ,自分で調べて改造する余地はありそうです。
GitHub - ThundeRatz/ros_yolo2: YOLOv2 integration with ROS
他にも信号機の抽出に特化したやつなどもあり,インターネットの集合知に感謝してもしきれません。
github.com
GitHubでのSSHキーの設定
SSHキーの設定では以下のサイトにお世話になりました。
monsat.hatenablog.com
秘密鍵の作成手順
まず,PC内の秘密鍵作成手順です。(一応Ubuntu16の環境を基準に話しします。)
簡単には次のようなコマンドをうちます。メールアドレスは自分のものにしてください。
ssh-keygen -t rsa -C "your_email@example.com"
入力後,以下の3つを入力要求されますが全部何も考えずにEnterして問題ないそうです。
ちゃんと勉強したければこちらを参考に。
SSHなるものをよくわからずに使っている人のための手引書 - Qiita
その後GitHubのサイトでProfile→SSH Keysの欄から「~/.ssh/id_rsa.pub」内の公開鍵を登録します。
幾つかのコピー方法があるらしいですが意識が低い私は次のコマンドで済ませました。
誰かしかってやってください。
cat ~/.ssh/id_rsa.pub
ポモドーロに用いるタイマーソフトの比較
ポモドーロとは
料理のことではなく,ポモドーロテクニックと呼ばれる作業時間と短い休憩を交互に繰り返すことで,作業量と集中力を管理する手法のことです。
生産性がグングン上がる!「ポモドーロ・テクニック」って知ってる? | リクナビNEXTジャーナル
一般に25分の作業と5分の休憩を交互に繰り返します。
ポモドーロは使えるか?
ADHDの気がある自分が一人でやってもあんまり効果は感じないです。集中できるときは長続きするしそうでない時は全然だったりのムラがあるタイプです。
しかし,これをラボ等で集団でやると全員が一斉に集中するので部屋が静かになり,自然と集中すべき環境が醸成されるのでなかなかどうして捗った気になります。(効果の程は未検証)
ポモドーロ & プロジェクタ
ポモドーロを手軽に導入したい場合,スマホのアプリをインストールして大音量で鳴らすのが手っ取り早いです。
この場合持ち主以外は残り時間などをチェックできなくて面倒です。
そこでプロジェクタに写すことを考えます。
単焦点プロジェクタは場所を取らなくて便利。
元ランプ&ハウジングfor the Ricoh PJ wx4141プロジェクタ – 180日保証
- メディア: Personal Computers
要求
そこで今回の要求としては次の2つがメインになります。
- プロジェクタに現在の時間等が大きく映る。
- 終了時や開始時にきちんと音が鳴る。
各ソフトの所感
<名称:評価>の形式で列挙します。
FREE Countdown Timer:▲
フリーソフト。
FREE Countdown Timer - CountdownKings
非常にクールで見やすいカウント画面と直感的に操作できる点が素晴らしい。
最大の欠点は音が鳴らせないことで,非常におしい存在になっています。
なお,スマホのアプリはきちんとそこの所が改善されているらしいのでおすすめです。
www.countdownkings.com
もっというとPC版にも音の鳴らせる上位ソフトがありますがそちらは有料のよう。
Minimalistic Countdown Timer Extended for PC & MAC
19ドル前後とあまり安くないので不採用。
Tomatime:○
Windows10のアプリから入手したフリーソフト。
tomatime を入手 - Microsoft Store ja-JP
音も鳴るし,それなりにわかりやすいUIで使い勝手の良い物になっています。
欠点は完了時等に鳴らす音が選択できない(嫌な音ではない)のと,ループ駆動できないこと。
ポモドーロを回す度に操作を要求されます。
それ以外は満足。
Focus to Do:◎
こちらもWindows10のアプリから入手したフリーソフト。
Focus To-Do: ポモドーロ技術 & タスク管理 を入手 - Microsoft Store ja-JP
サイトから持ってきた画像ですが非常にシンプルでプロジェクタ向き。
また,作業毎にポモドーロの数を設定して自動ループを組むことができ,サインインしたら作業経過を共有することも可能です。
あと,開始時と終了時の音が自由にいじれるのも良いです。(選択肢を増やすには課金が必要。よくできてますね。)
ということで,こちらを採用して行こうと思います。
番外編
Chrome アプリ Tomato Timer
自分でやるならChromeアプリ版のTomato Timerが良いでしょう。
chrome.google.com
Chromeさえついていれば計測ができます。
黙れナレーター(Windowsのナレーター機能を完全封印する)
Introduction
メロスは激怒した。かならず、かの 邪智暴虐 ( じゃちぼうぎゃく ) のナレーターを除かなければならぬと決意した。メロスにはコンピウタがわからぬ。メロスは、ただの学生である。けれどもWindowsの無用なクソ機能に対しては、人一倍に敏感であった。
邪智暴虐のナレーター
今回の殲滅対象である。降臨方法は「Ctrl」+「Windowsキー」+「Enter」である。
降臨後はSAN値がすり減る前に速やかに再度同じコマンドをうって消滅スべし。
https://support.microsoft.com/ja-jp/help/17173/windows-10-hear-text-read-aloud
ナレーターの倒し方
Windows8の場合は以下の記事を参照。
うっとうしいWindowsの「ナレーター」を完全に無効化する方法 | TeraDas-テラダス
本記事ではWndows10のナレーターを討伐する。
「Windowsキー」+「r」を押して以下のwindowを出現させ「regedit」とうってEnter。
以下のようなレジスタの「HKEY_CURRENT_USER\SOFTWARE\Microsoft\Narrator\NoRoam」へとたどり着く。
赤で囲ってある箇所をダブルクリックして以下のように値を書き換える。
これでナレータのショートカットを無効にしたことになる。
ナレーターは二度死ぬ
ショートカットを無効にした所で奴の本体は生きている。追い打ちをかけるべし。
「C:\Windows\System32」からNarrator.exeを探し出す。
右クリックで「プロパティ」を開くと以下のような画面が出る。
「セキュリティ」のタブを開いて「詳細設定」をクリック。
以下のように赤枠がUsersになっていれば「OK」を押して戻る。
「TrustedInstaller」など他のものになっていれば権限を変更しに行く。
権限を変更するには「編集」を押して出て来る以下の画面をひらき,赤枠に「Users」とうったのちに右側の名前を検索をタッチ。
うまく行けばさっきの赤枠内に自分のユーザ名が表示される。
そしたら以下の画面に戻って,「編集」の所をクリックして
これにて終劇。
ナレーターは死んだ!もういない!
勝利のBGMに酔うと良い。
www.youtube.com
MATLABでパーティクルフィルタ
流石に適当に書きすぎたか
この辺の分野はどの専門を土台にするかでかなり説明などが変わってきます。
私は制御&ロボティクスが半々くらい。EKFやベイズの定理などはすでにMasterしているものとします。
(ていうか説明しない)
基礎は確率ロボティクスで勉強しよう。
- 作者: Sebastian Thrun,Wolfram Burgard,Dieter Fox,上田隆一
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/09/21
- メディア: 単行本
- この商品を含むブログ (1件) を見る
ちなみに英語版のドラフトは以下のURLに落ちています。
https://docs.ufpr.br/~danielsantos/ProbabilisticRobotics.pdf
書籍版と比べましたが書籍版の方が洗練されてますね。英語読むの辛いし。
パーティクルフィルタとは
ベイズフィルタの亜種。状態推定に必要な確率分布を数式ではなく,多数の粒子群の集合として表現する手法です。
粒子の数を増やせば実質どのような分布でも表現でき,状態方程式とノイズの分布がわかっていればどのような関数でも同じように実装できるのが強み。
wikiを見るか以下の説明が簡潔かと。
なお,『カルマンフィルタもパーティクルフィルタも全部ベイズフィルタで説明がつく』という説明が美しいのでやはり上記の確率ロボティクスの本を読むことをおすすめします。
パーティクルフィルタ - おべんきょうwiki - アットウィキ
実装などについては以下のサイトが参考にしやすい。
Tutorial/Practice0 – MIST Project
Pythonの実装例でよければ確率ロボティクスを和訳した上田先生が公開しているモンテカルロ自己位置同定の話なんかが実装の参考になることでしょう。
github.com
後は鏡先生のスライドとかも参考になるか?
http://www.ic.is.tohoku.ac.jp/~swk/lecture/ic2012/kagami_ic20120710.pdf
matlab実装
というかMATLABの実装もAtsushiさんがやってくれてます。自己位置同定に関してはこれを使えば良いでしょう。
Particle Filterを使用した自己位置推定MATLABサンプルプログラム - MyEnigma
もう少し汎用的な話なら以下のブログがわかりやすいかと思います。式はいくつかこのブログから拝借してます。
satomacoto: Pythonでパーティクルフィルタを実装してみる
ちゃんとわかりたかったらやっぱり教科書を読みましょう。あれはやはり名著です。
各々の粒子は状態,重みをもつ。
状態推定
各々の粒子はそれぞれ自分の状態,重みをもつとします。
状態推定はEKF等と同じ流れで,状態方程式に基づいて各々の粒子を遷移します。
「各々のパーティクルごとに更新をするという点」と「実際に乱数を与えてノイズも加える」という点が少し違います。
まぁモンテカルロって言ってますしね。実際に試していくわけです。
観測に依る更新
一方,状態更新の際には尤度を使って更新します。
このp(Y|X)というやつが曲者ですが,ノイズをガウス分布と仮定するなら次のように書けます。
この更新に使う尤度は次のように計算します。(1次元の場合)
ここで,p(Y|X)は相対的な値がわかればよいです。
なぜなら,この後,全てのParticleに対して尤度を元に重みを更新しますが,更新した重みの和が1になるように正規化します。
従って,どうせ後で割り算でつじつま合わせの補正がされるので余計な計算はしなくて良いということですね。
ここが気味が悪いと思う人はやはり教科書を(ry
これもわかりやすく説明するのは他の人に投げたい。
個人的な解釈
解釈の例を載せておきます。間違っていたら指摘してください。
非線形出力方程式として
Y = g(X) + ⊿
とでもしてみましょう。g()が非線形関数の出力で⊿が平均0,分散σ×σのガウス分布とします。
はてな形式で数式をうつのはだるいのでこれで勘弁
g(X)を左に移行する式変形をするとつまるところ,Y-g(X)は平均が0で分散がσ^2のガウス分布に従うことになります。
そしてガウス分布の式はWikiより次のように表せます。
このxの代わりにY-g(X)をぶち込んだ分布にXとYは従うということです。
つまり特定のXの時に特定のYを取る分布p(Y|X)はまさにこの分布に従うということです。
うーん,うーん,また教科書読み直してきます。
深夜に書いてて頭痛くなってきた。
リサンプリング
最後に新たに得られた重みの大きさに応じて粒子を再配置します。
パーティクルフィルタによる自己位置推定動作の可視化 - Qiita リサンプリングの項を参照。(孫引用で申し訳ない)
注意しないと確率の低めな粒子が全て淘汰されて推定値の集合が一点付近に収束してしまい,誤った値に収束して動けなくなったり,突然の外乱で値がずれたときに追従できなくなってしまうなどと言った問題が発生します。
これにも手法論がいろいろありまして
(確率ロボティクス第五回 参照)
「系統抽出法」を使うのがおおかた妥当らしいです。
重みを元に領域を区切り直して再びばらまく&その際にランダム性を持たせて粒子の多様性を保存する的な意味合いです。
尤度の設定は重み付き平均でいいのか?
単峰性が確約されない場合重み付き平均は良くない場合も多いです。
以下のブログが非常にわかりやすい。
qiita.com
コード
応用例としてwikiの速度推定の話をしましょう。
カルマンフィルター - Wikipedia
速度がランダムウォークするとの仮定のもと,位置と速度の2つの状態を持つ状態を推定するという問題です。
コード置き場
例のごとくGistにあげました。リサンプリングとかはAtsusiさんのをほぼそのまま借りてます。ありがとうございます。
実装のコツ
クラスで作成しました。変数の状態等を内部できちんと管理するのにいいですね。
また,関数ハンドルとして状態方程式等を与えることに寄って,自分の設定した状態方程式に合わせた実装が容易にできるようにしました。
おそらく大体の関数においてこのコードは使用可能ではないでしょうか。
関数ハンドルにかんしては詳しくは「無名関数」でググってほしいですが
f=@(x,y)x+y
としたなら
f(x,y) >> 5
という風に使えるものを関数ハンドルと呼びます。これで
state=@(x,u)A*x+B*u
とでも書けば状態方程式を簡単に定義できるというわけ。これは覚えて置いて損はないかと。
結果
なんかあんまり恩恵受けた感じしないですね。
とりあえず動いているのではなかろうか。
総評・所感
正直に言ってカルマンフィルタより実装が楽かというと全然そんなことは無いし,計算量もクソ重でした。
(これは行列演算ライブラリの利点を生かす実装をしなかったという点が大きいが)
一番困難なところはチューニングで,状態遷移のときのノイズをそれなりに大きく取らないとパーティクルがうまく撒けないし,
(追記:いや,これはどっちかというと初期値のバラまき方の問題というべきか。)
毎ステップでランダム要素が入るので,妙なことが起こるのではという不安もそれなりにあります。
そして周波数領域での設計とか超やりにくいじゃん!という致命的な制御屋の不満があったり,,,
何れにせよ多量のサンプルを用いて幅広い表現力を得た代わりにチューニングや設計のコツなども多分にややこしくなったというのが本当のところではないだろうか。
「パーティクルフィルタは簡単」との言はもっとロボットのローカライゼーションとかやる時に実感できるのかなぁ…