粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

カルマンフィルタの推定値の信頼区間を書く

カルマンフィルタから信頼区間の線を引きたいというのは当然の要求だと思うのですが見渡す限り 良さげな文献が無いので自分で書きます。 書いておいて何ですが自信がないので訂正等のご意見を随時求めております。

あと,ブログの本文もMarkdownにシフトしてみました。
[tex: ]ってうつのめんどくさいな。

理論

参考文献

きちんとした参考文献を見つけられずに困ってます。 一番まともそうなのがStackOverflowしかないんだけど… python - Estimating confidence intervals around Kalman filter - Stack Overflow

あと,確率論とかについては以下の本を。

確率ロボティクス (プレミアムブックス版)

確率ロボティクス (プレミアムブックス版)

足立先生の本も良著なのでオススメ。
カルマンフィルタの基礎

カルマンフィルタの基礎

追記:それっぽい論文見つけました1966年の論文です。 Confidence, Prediction, and Tolerance Regions for the Multivariate Normal Distribution on JSTOR

カルマンフィルタにおける信頼区間とは

まずは信頼区間についてwikiで確認してください。 信頼区間 - Wikipedia

以下の図のように分布の形状と平均分散などの値がわかっていれば値がどの確率でどの範囲に収まっているかがわかります。 こういうやつ

カルマンフィルタでは誤差にガウス分布を仮定しており,我々がフィルタで推定する推定値Xはこの分布の平均値でした。 また,この際同時に誤差共分散行列Pも求められるので推定値の不確かさも同時に推定できます。

従ってこれらの情報からある値の範囲に真値がN%の確率で存在するだろうということがわかります。

n次の状態変数における信頼区間

追記:上記の論文から記述を引っ張ってきました。 f:id:ossyaritoori:20171121163838p:plain

さっくり要約すると推定値\bar{x}と推定共分散行列Pに対して,αの信頼区間を示す楕円は次のように計算できるというものです。
 (x-\bar{x})^\top P^{-1} (x-\bar{x}) = \chi ^2 (1-\alpha,n)

カイ二乗分布で検定できるんですね。 カイ二乗分布 - Wikipedia

別解:シグマ区間からの拡張

StackOverflowの記述によると以下の方程式を解くことでベクトルxに対する1シグマの区間を計算できます。 これの出典が知りたい…

(x-\bar{x})^\top P^{-1} (x-\bar{x}) = 1 ここから1σ区間を推定してカイ二乗分布から何σ分の信頼区間が必要になるのかを推定して何倍かすれば求まるでしょう。

Matlabによる実装1

とりあえず,論文にあった手法を実装してみましょう。SymbolicMath ToolBoxが必要になります。

カイ二乗分布の境界値

要は \chi ^2 (1-\alpha,n)を計算します。 一応以下のような表があるのですが,matlabではchi2inv(α,n)という関数が用意されています。 付表:カイ2乗分布表 chi-square distribution — 中川雅央(滋賀大学) カイ二乗逆累積分布関数と言うらしいですね。 試しに,2自由度の95%信頼区間が何σ必要かという話では

chi2inv(0.95,2)

とうつと5.9915と計算できます。

統計の授業でやる1自由度の時の1σ区間に68.27%のデータが入っているという話は chi2inv(0.6827,1)=1という結果から確認できます。 注意として1自由度の時の2σ区間には95.5%の値が入っていますが chi2inv(0.955,1)=4.0186の結果からわかるように 逆累積分布関数から計算されるのは区間の大きさの2乗です。(用語が不明瞭)

Symbolic Math Toolboxを用いた代数方程式の解法

MATLABのStudentにデフォルトで入っているSymbolicMathToolboxを使えば次のような式はいとも簡単に解くことが可能です。 2自由度までならせいぜい扁平な楕円なので頑張って手計算するというのも良いかもしれませんが。  (x-\bar{x})^\top P^{-1} (x-\bar{x}) = \chi ^2 (1-\alpha,n)

具体的な例で行きましょう。

% Set Value
Xhat = [1;2]
Phat =[1 0.5;0.5 2]

% Get dimension
Dim = size(Xhat,1);
alpha = 0.95;
bound = chi2inv(alpha,Dim);

% Set symbolic equation
X = sym('x',[Dim 1]);
equation = (X-Xhat).'*inv(Phat) *(X-Xhat) == bound

% Plot Function
ezplot(equation)
hold on 
plot(Xhat(1),Xhat(2),'r+')
grid on

今回得た知見として,ezplotを用いることでEquationをplotできるのが簡単で良さげです。 f:id:ossyaritoori:20171121173519p:plain

SLAMなどではこのまま楕円の範囲が位置推定の信頼区間になるのでいいですが,カルマンフィルタの状態推定の場合各状態の変位の範囲が知りたいわけなので, 以下の青線の範囲が知りたいわけです。 f:id:ossyaritoori:20171121174056p:plain

これは先程のEquationに状態変数の値を代入して解くことで達成されて,

Eq1 = subs(equation,X(2),Xhat(2));
Eq2 = subs(equation,X(1),Xhat(1));

Ans1=double(solve(Eq1));
Ans2=double(solve(Eq2));

結果,次のようになります。これが知りたかった95%信頼区間の下界と上界です。

Ans1 =

   -1.2897
    3.2897

Ans2 =

   -1.2381
    5.2381

実は,結局ある状態変数の信頼区間の上界下界の計算に必要なのは共分散行列の逆行列のi行i列目の成分だけなのです。 もっと言うと,共分散行列の逆行列の逆数の値がその推定値の標準偏差になるってところでしょうか。

MATLAB関数として実装

関数として書こうと思ったんですが先程の流れをそのまま関数にすると結構重いものが出来上がります。 とりあえずConfidenceInterval.m関数を作成しました。

実際に適用すると例えばこんな感じ。正直大げさなくらいの範囲が求まります。 f:id:ossyaritoori:20171121223208p:plain

引数は推定値,共分散行列,信頼区間(デフォルト値95%)です。 要望やバグがあればブラッシュアップします。

追記&最終版:実は超簡単

上記の関数は問題をややこしく解いています。 楕円を書かなくても良い場合,実は問題は超簡単で 以下の数式を解けば良いことになります。 f:id:ossyaritoori:20171121232247p:plain

おそらく改善の余地がないのでこれを最終版とします,

% Author: Yoshi Ri @ The Univ of Tokyo 
% Date : Nov 2017
% Get ConfidenceInterval of 

function [Xmax ,Xmin]= ConfidenceInterval(Xhat,Phat,p)
% Xhat : Estimated State, Phat : Estimated Covariance, p : percentage of
% prediction

if nargin==2
p=0.95;
%print('set default p=95%!')
end

% Get dimension
Dim = size(Xhat,1);
alpha = p;
bound = chi2inv(alpha,Dim);

% Set symbolic equation
Pinv= inv(Phat);

% Get upper and lower boundary
Xmax=zeros(size(Xhat));
Xmin=zeros(size(Xhat));
for i=1:Dim
    Xmin(i)=Xhat(i)- sqrt(bound/Pinv(i,i));
    Xmax(i)=Xhat(i)+ sqrt(bound/Pinv(i,i));
end

end

疑問点

そもそも筆者は検定とか統計とかふわふわした知識でやっているので, 強マンによる本質的な記事の矯正が必要です。

心が折れない程度に指摘してください。

VisualStudio Codeでマークダウン & Texを書く

VScode結構軽快And綺麗ということで使いはじめているのでメモ。
Markdownはかなり書いていて気持ちが良いです。

VScodeについて

軽快かつ様々なExtensionを組み込める自由度の高いエディタ。
見た目も良い感じ。

Download Visual Studio Code - Mac, Linux, Windows

VScodeMarkdown

数式以外は軽快アンド快適なので,今後も使用する予定。

使用する拡張機能

拡張機能は左下のアイコンをクリックするか,Ctrl+Shift+Xで検索窓を出せます。

f:id:ossyaritoori:20171114212614p:plain

基本設定

画像を貼るPasteImageではCtrl+Alt+Vで画像を貼りますがこれには予め他のTex関係の他のコマンドが設定されているため,
そこでエラーが出てうまくいきません。基本設定のところから割当てを変更するかしましょう。

Markdown機能の改善・知りたいこと

数式マクロを組めない問題

数式でマクロを使いたいんですが以下のようなものを使えば出来るのはわかっているんですけど
macros - Visual Studio Marketplace
面倒。
こんな感じに書きたいのだけれど…
ossyaritoori.hatenablog.com

追記:KaTexにおけるマクロ定義について

Markdown+Math]のパッケージではKaTexを用いています。
これはStackEditやQiita等が用いるMathJaxとは異なり \newcommandなどのコードが使えないという仕様です。

従ってMacroを書く場合はPCの何処かにあるKatexの設定に以下のように書く必要があるそうな。めんど。
add support for macros via \def and \newcommand · Issue #250 · Khan/KaTeX · GitHub

追記2:MathJaxを使うには

以下のパッチを当てればMathjaxを使えるかと。その場合,恐らくプリアンブルは上手く書けると思います。
#vscode Visual Studio Codeのmarkdownでmathjaxを使えるようにするパッチ(仮) · GitHub

pandocを介したPDF化

PDF化するときの問題に,MarkdownPDFはプレビューではなく,そのまま印刷する傾向にあります。
つまり折角数式をきれいに書いてもうまいこと変換をしてくれたりはしないのです。

必要となるものは以下の2つです。

[Visual Studio Code][Windows] MarkdownでPDF/HTML/DOCXファイルへの変換方法とチートシート | Gabekore Garage


VScodeplatexコンパイル

基本的にはTexstudioで書くが,使ってみたかんじそんなに悪くないので乗り換えも検討中。
TexStudioとの違いはLatex Workshopの拡張機能を使うことにより文章の保存とコンパイル,表示を同時に行う点。

使用する拡張機能

  • Latex Language Support:言語サポート。これがないと日本語を満足に打てない。
  • Latex WorkShop:文法に関する知識を入れ込んでいる。ハイライトやエラー検出のお供に。

f:id:ossyaritoori:20171114211852p:plain

他にも便利なのがあったら追加予定。

最低限の基本設定

latexを書いて,コンパイルコマンドプロンプトに投げているのでTexStudioとやっていることは同じです。

流れは以下の通りなのでこれを自動化するようにすれば良いです。

「基本設定」→「設定」で次のように書いちゃいましょう。

{
  "latex-workshop.latex.autoBuild.onSave.enabled": false,
  "latex-workshop.latex.toolchain": [
    {
        "command": "platex",
        "args": [
            "-synctex=1",
            "-interaction=nonstopmode",
            "-file-line-error",
            "-jobname=\"%DOCFILE%\"",
            "-kanji=utf8",
            "-guess-input-enc",
            "%DOCFILE%.tex"
        ]
    },
    {
        "command": "pbibtex",
        "args": [
            "%DOCFILE%"
        ]
    },
    {
        "command": "platex",
        "args": [
            "-synctex=1",
            "-interaction=nonstopmode",
            "-file-line-error",
            "-jobname=\"%DOCFILE%\"",
            "-kanji=utf8",
            "-guess-input-enc",
            "%DOCFILE%.tex"
        ]
    },
    {
        "command": "platex",
        "args": [
            "-synctex=1",
            "-interaction=nonstopmode",
            "-file-line-error",
            "-jobname=\"%DOCFILE%\"",
            "-kanji=utf8",
            "-guess-input-enc",
            "%DOCFILE%.tex"
        ]
    },
    {
        "command": "dvipdfmx",
        "args": [
            "-f",
            "yu-win10.map",
            "%DOCFILE%"
        ]
    }
  ]
}

注意:bibtexを使わない場合はエラーが出るので上2つをコメントアウトしてしまった方が安全かもしれません。
注意2:bibtexで引用を一切しない場合もエラーが出ます。なんか適当に引用しておきましょう。
注意3:なお,保存時にコンパイルする設定は負荷の原因になるので無効にしています。

Latexmkを用いた場合

latexmkを使う場合は次のように設定を変更します。
StrawberryperlなどのPerl環境が整っていればlatexmkが使えます。

{
  "latex-workshop.latex.autoBuild.onSave.enabled": false,
  "latex-workshop.latex.toolchain": [
    {
      "command": "latexmk",
      "args": [
        "-e",
        "$latex=q/platex %O -kanji=utf8 -synctex=1 -interaction=nonstopmode %S/",
        "-e",
        "$biber=q/biber %O --bblencoding=utf8 -u -U --output_safechars %B/",
        "-e",
        "$bibtex=q/pbibtex %O -kanji=utf8 %B/",
        "-e",
        "$makeindex=q/mendex %O -o %D %S/",
        "-e",
        "$dvipdf=q/dvipdfmx %O -o %D %S/",
        "-e",
        "$pdf_mode=3",
        "-norc",
        "-pdfdvi",
        "%DOC%"
      ]
    }
  ]
}

追記:latexmkでjarticleがコンパイル出来ない問題。

まだぶち当たっていないのですがこういうこともあるらしいぞと。
タイプセットツールをptex2pdfに変更。
VS CodeでTeXを使う方法 - elechoのぶろぐ

"latex-workshop.latex.toolchain": [{
    "command": "ptex2pdf",
    "args": [
        "-l",
        "-ot",
        "-kanji=utf8 -synctex=1",
        "%DOC%"
    ]
}],

Usepackageで相対・絶対パス上のファイルを指定できるか?

出来ます。これでGitやDropBoxで動的に更新されるstyファイルを使う事ができます。

絶対パスの与え方

例えばこんな感じ。

\usepackage{C:/Users/Ossyaritoori/Documents/GitHub/LaTeX_template/<yourfile>}

この際,コツとして

  • ファイル名の拡張子 .sty を省略する
  • 「\」はTexで変に解釈されるので「/」を使う

があげられます。

相対パスの与え方

同様。

\usepackage{../style/<yourfile>}

なお,Staticなstyファイルは普通にTexのdist-packageに置きましょう。
ossyaritoori.hatenablog.com

リモートデスクトップのUbuntuのTab補間を有効化

ossyaritoori.hatenablog.com

問題編

WindowsからリモートでUbuntu(ログインした時のレイアウトはXubuntu)にログインすると
「Tab補間」が効かなくなる問題があります。これはバグではなくxrdpのデフォルトの仕様のようです。
gihyo.jp
技術メモメモ: Xubuntu 16.04にxrdpを使ってRDPでリモートデスクトップ接続をする

解決編

上記に加えて以下のやり取りも参考にしました。
Bash auto_completion with Xubuntu and xrdp from windows - Ask Ubuntu

以下のファイルを編集します。
~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml

下の方に,

<property name="<Super>Tab" type="string" value="switch_window_key"/>

という行があるのでこれを編集して

<property name="<Super>Tab" type="string" type="empty"/>

へと書き換えます。

その後サービスを再起動します。
sudo service xrdp restart
って感じだったはず。この時点で接続が切れるので注意です。
普通にOSを再起動してもいいかも。


以上。

私的文章作成手法あれこれまとめ

最近いろいろ試していて混乱してきたのでメモ

使用中のもの

Texstudio

デフォルトの文章作成ツール

おなじみのTex文章作成ツール。利点は

  • 機能が豊富。辞書と予測変換の使い勝手の良さ。
  • SumatraPDFとの連携でより使いやすく。コンパイル時の操作も指定可能

ossyaritoori.hatenablog.com

jupyter notebook

ちょっとした説明資料用


最近取り入れようとしている。コードと文章を共存できる強いやつ。

  • コードもTexも専用のエディタの使い勝手には及ばない
  • コメントが見やすいコードだと思えばまぁ悪くないかも
  • 起動が若干面倒

まぁ作成後もTexへと起こす事ができるので比較的無駄はない。
ossyaritoori.hatenablog.com

StackEdit

コンパイルのいらないオンラインTexもどきメモ
f:id:ossyaritoori:20171111160457p:plain

GoogleChromeの拡張アプリ。GoogleDrive上でも使える簡単なMarkdownエディタ。

  • 簡単でわかりやすい機能
  • GoogleDriveやDropbox等と好相性
  • Webに繋げない時起動が出来ない…?(未検証)
  • PDF化に年間525円必要。

Classeur

StackEditの後継。
StackEditに比べて多機能かつPDF化も無料。
ハイライトがちょっと見づらい。

f:id:ossyaritoori:20171111155852p:plain
Pandocを介するっぽいのでPDF化で時々エラーがでるかも。

VisualStudioCode

ローカルなMarkdownエディタとして使用中。軽快に動く万能Editor。見た目がかっこいいのもGood。

f:id:ossyaritoori:20171111155439p:plain

で数式を打てるMarkdown環境の完成。

GoogeDocument

図付きのメモ帳。

特筆することは無いが,無難に使えるのと画像をポンと貼れるのが良い。
SnippingToolで切り取りしてGoogleDocumentに貼るとお手軽で見やすい文章が出来る。

後はマークダウンに対応してほしかった。

Word

嫌いだが,使わなければいけない場合がある。
上記全てが揃っていると特に出番はない。

嫌々使う

ためそうと思っているもの

Atom

Githubが開発したエディタ。

  • Markdownの記述に向いている。(というか大体のことが出来る)
  • Editor上でGitへとコミット可能。
  • メモリを結構食う&起動がちょっと遅いらしい
  • jupyterがエディタ上で動く。Hydorogen

オフラインでのメモに使えそう。

マークダウンの数式入力で楽をするマクロ

JupyterでTexソースコードを書くことで,資料と実行コードを両立できてモチベや管理が楽になるかと思い色々いじっています。
追記: StackEditのマークダウンでも有効なことを確認。タイトルを修正

ossyaritoori.hatenablog.com

数式マクロをjypyter notebookで使う。

行列などは書くのが面倒すぎてマクロがないと書きたくない体になってしまいました。
ossyaritoori.hatenablog.com

jupyterでもこのマクロを導入する事ができます。
詳しくはこの質疑に情報が詰まっています。
IPython (Jupyter) MathJaX preamble - Stack Overflow

やり方は,「$$で囲んだ箇所にnewcommandを書く」でおしまいです。
少し不格好ですがノート頭で私は以下のようにマクロ宣言を実行しています。

## Tex Preamble
$$
\newcommand{\bm}[1]{{\bf #1}}
\newcommand{\eq}[1]{Eq.(\ref{eq:#1})}
\newcommand{\zu}[1]{図\ref{fig:#1}}
\newcommand{\shiki}[1]{式(\ref{eq:#1})}
\newcommand{\fig}[1]{Fig.\ \ref{fig:#1}}
\newcommand{\grp}[1]{Fig.\ \ref{grp:#1}}
\newcommand{\tab}[1]{Table\ \ref{tab:#1}}
\newcommand{\defeq}{:=}
\newcommand{\tvec}[1]{\bvec{#1}^{\mathsf{T}}} 
\newcommand{\mr}[1]{\mathrm{#1}}%rm体
\newcommand{\ml}[1]{\mathcal{#1}}%frac体
\newcommand{\bmat}[1]{\begin{bmatrix} #1 \end{bmatrix}}%行列簡略化
\newcommand{\pmat}[1]{\begin{pmatrix} #1 \end{pmatrix}}%行列簡略化
\newcommand{\mat}[1]{\left( \begin{matrix} #1 \end{matrix} \right)}%行列簡略化
%\newcommand{\nom}[1]{ \ml{N} \{ 0,\sigma_{ #1 } \} }
\newcommand{\expo}[1]{ \mathrm{e}^{#1} }
$$

どんな感じになるか画像

マクロ宣言部分は実は実行後消えるのでそこまで不格好な感じにはならないかと。
f:id:ossyaritoori:20171029174026p:plain

このようにスッキリ。
f:id:ossyaritoori:20171029174045p:plain

問題・課題

厳密には走っているのはTexではなくMathJaxなのでいくつかの関数は使えません。
例えばちょっと驚いたのは

  • \boldmath

が使えないことです。

あとは,これをTexにした所,宣言文が\[で囲まれ,数式として認識されてエラーが出ます。
従って全自動はめんどくさそう…

快適にjupyternotebookを書くという目的以外には使わない方が良さそうです。

Windows10からUbuntu16(jetsonTX1)へとリモートデスクトップ接続

いつだかラズパイ上のUbuntuへのリモートデスクトップ接続を試しました。

ossyaritoori.hatenablog.com

今回はGPUボードに接続したいのですが,前回の手法だと何故かうまくいかないので以下の回答に準拠しました。
remote desktop - Can I access Ubuntu from Windows remotely? - Ask Ubuntu

Ubuntu側のセットアップ手順

XRSPをインストール

sudo apt-get update
sudo apt-get install xrdp

次にHomeディレクトリに移動して,

sudo apt-get install xfce4 
echo xfce4-session >~/.xsession

最後に以下のファイルを編集します。

sudo gedit /etc/xrdp/startwm.sh

編集結果がこちら

#!/bin/sh

if [ -r /etc/default/locale ]; then
  . /etc/default/locale
  export LANG LANGUAGE
fi

startxfce4

私の場合は最終行だけ変更することになりました。

その後サービスをリスタート

sudo service xrdp restart

Windows側からの接続

リモートデスクトップ接続の画面から接続します。
過去記事を参照。

結果以下のような画面が見れます。
なんだか元のデスクトップと違うのですがこういう仕様でしたっけ?
f:id:ossyaritoori:20171027220153p:plain

何かあったら追記します。