test

ビジネスと技術やってたらロボティクスにいきついた人のブログ

確率ロボティクスの式変形の行間解説

github.com

 

はじめました。

物理やってると死ぬほどやるのでもう訓練されてしまったんですが、行列の計算とか結構苦戦している人も多いようなので少しでも力になれれば。

上田先生が式追うならTeXで書いてくれると捗るとつぶやいていたのではてぶではなくgithubtexソース公開しながらちくちく作ります。

 

ツッコミ、要望などお待ちしています。

geforce搭載PCにubuntuいれようとして苦戦した話

何度やってもトラブル起こしますねこいつは・・・。

詳細はあとで追記するとして、とりあえず作業メモを・・・。

 

この記事で解決されるかもしれない症状

a. USBメモリから起動できない

b. セキュアブートを変更するけどええか?と聞かれ、設定してもいないパスワードを要求されどうしようもなくなる

c. ドライバのインストールを実行後、nvidia-smiを実行すると

Make sure that the latest NVIDIA driver is installed and running.

などと表示され正常にコマンドが終了しない

d. nvidia-smiはちゃんと通るけど、ログインすると背景しか表示されない状態になる(マウスカーソルは出るし右クリックはできる)

 

 

モチベーション

ゲーム用に持ってるwindows10機のハードウェアを活かして機械学習用のubuntu機を作りたいが、ゲーム用のwindows10環境は一切変更したくない

 

 

方針

SSDを1つ増設し、まっさらなSSDubuntuをインストールする。

ubuntu入りのディスクとwindows10入りのディスクはBIOSから起動ドライブの優先順位を変更することで切り替える。

 

 

ハードウェア構成

マザボ:H110M4-M01

GPUGeForce GTX 1070

投入するubuntuUbuntu 16.04 LTS 日本語 Remix リリース | Ubuntu Japanese Team

 

 

手法

1. インストール用のライブUSBの作成

イメージは

Ubuntu 16.04 LTS 日本語 Remix リリース | Ubuntu Japanese Team

ライブUSBは

Universal USB Installer 1.9.8.2 - ダウンロード

で作成。

 

2. ライブUSBからインストール(a. USBメモリから起動できないの解決法)

普通には起動しません・・・。

qiita.com

上記の記事の2を行うと起動します。

 

上記の記事の3をそのままやってもまともにインストールできませんでしたが・・・。

 

3. Linuxカーネルのアップデート(cの解決法)

 ドライバインストールの前にカーネルのバージョンを上げる。

以下を実行するとカーネルのバージョンが上がる。

 sudo apt install linux-generic-hwe-16.04 

 

いくら以上が要求かどこかに書いてあると思うが、そのうち探す。

 

4. セキュアブートの無効(bの解決法)

ドライバのインストールをすると、セキュアブートをdisableにさせてくれと要求される。

そこで、mokutilを使って無効にする。

sudo apt-get install mokutil

sudo mokutil --disable-validation

ここでパスワードを設定することになる。

 

再起動すると、いつもと違う画面になるので、

change secure boot stateを選び、パスワードを入力する。

この際、めちゃくちゃわかりにくいんだが、

Enter password character 3

とかいう聞かれ方をする。

これは、「パスワードの頭から数えて3文字目の文字を入力しろ」ということです。

あとは画面に従えばいいと思う。

 

5. ドライバのインストール

まず、インストール前に、(たぶん苦労した末にできたであろう)あらかじめインストールされてるドライバを削除する

sudo apt-get --purge remove nvidia-*

 

その後は

UbuntuにNVIDIAドライバを入れる手順 - Qiita

の3の手順を実行する。

 

nvidia-smiが成功した人、おめでとう!

失敗した人、力になれなくてすまんな・・・。

 

6.(オマケ) ログインしたけど背景(壁紙)だけしか表示されないんだけど・・・

compizの設定がぶっ壊れてるっぽい。これをためそう

https://toxweblog.toxbe.com/2017/10/01/ubuntu-no-icon-menu/

ベイズ統計からみた頻度主義的検定手法

主旨

ベイズ統計と頻度主義でやってる検定ってどういう関係があるの?

という疑問について考えてみる。

 

議論

ベイズ統計では以下のように分布を取り扱う事が多い。

 

サンプリングされたデータを用いて次にとれるデータがどの程度の確率でどの値になるか予測したい。

この問題はデータがどのような確率分布に従うか推定する問題であり

予めパラメトリックな確率モデルが想定できるなら、 確率モデルのパラメータを求める問題になる。

例えばデータが正規分布に従うと思われる場合、「次にとれるデータがどの程度の確率でどの値になるかの予測」は「今とれているデータを生成している正規分布の平均と分散はいくらと推定されるか」という問題になる。

話を具体的にするため、以下ではデータは正規分布に従うとする。 

 

これを数式で表すと、2つの確率変数x,\ \thetaがあって、

x \in \mathbb{R} ^nはサンプリングされたデータ、 \theta \in \mathbb{R} ^2は確率モデルを特徴づけるパラメータ、正規分布においては分散と平均)

次の事後分布を考える

 p(\theta|x)

 

言葉で書くと、今取れている xというデータがある前提のもと、分散と平均が\theta となる確率 p(\theta|x)を考える。

 

ベイズの定理より

 p(\theta|x) \propto p(x|\theta)p(\theta)

 

 p(x|\theta)正規分布に従っている

 p(\theta)は事前分布と呼ばれるもので、 p(\theta|x)と同じ関数型になるように取ると便利である。(これを共役事前分布という)

 

例えば、\theta のうち平均は既知で分散を推定したい場合、事前分布として逆ガンマ分布をとる。

そうすると上記の計算により事後分布が計算できて、未知なるデータに対するの推定が可能になる。

 

頻度主義的な検定の手法は、上記の方法で求めた p(\theta|x)を使って、別のデータセットで求めた平均・分散\hat{\theta }がどの程度の確率密度 p(\hat{\theta }|x)をもつかということを問題にしている。

例えば、別のデータセットが異なる分散をもつという仮説を検定(これをするときは、 p(\theta|x)を異なるデータセットから得られた分散以上の領域で積分して、有意水準を超えれば仮説は採択される。

 

ideapad 710S Plus-13IKBにubuntu 16.04LTSをインストールした話

やりたいこと

手持ちのノートPC(ideapad 710S Plus-13IKB)にubuntuをインストールしたい

 

注意

この作業を行うとwindowsが立ち上がらなくなる

逆の操作を行うと修復できる可能性はありますが未確認です

データが無事かも不明 

 

結論

linuxSATAコントローラーをRAIDモードからAHCIモードに変更して使う必要がある

ideapad 710S Plus-13IKBにデフォルトで入っているBIOSではこの操作ができない

BIOSのアップデートを行うとAHCIに変更できるようになる(BIOSは下記から入手)

laptops and netbooks :: 700 series :: 710s plus 13ikb - JP

BIOSのアップデートを行ったあとは通常の手順でインストールできる

 

やったこと

まずは一般的な手順を試した。

当初はデュアルブートにしたかったので下記の記事を参考に作業した

qiita.com

 

USBからubuntuを起動しインストールを進めようとすると、インストール先にあけておいたSSDの未割り当て領域が表示されない。

それどころか一切のドライブが表示されない。

 

ターミナルからfdisk -lすると、USBメモリは見えているが、内蔵のSSDは見えていない状況

ドライブが認識されない問題はググると「ちゃんとmountしないとだめだよ」という話が出てくるが、fdisk -lで見えないならubuntuからは「そもそも物理的に接続できていませんよ」ということと同じだろう。

 

この時点でハードウェア固有の問題かなと思ったので「ideapad linux」とかでググってレノボのフォーラムから情報を集めることにした。

するとこんな記事がでてきた

 

"ideapad 710s and Linux"

https://forums.lenovo.com/t5/Linux-Discussion/ideapad-710s-and-Linux/td-p/3358780

ideapad 710sにデフォルトで入っているBIOSAHCIモードに非対応でlinuxのインストールはできないという話。

Solutionに飛ぶとLinux用のBIOSが一部提供されている。

 

ただし、注意して見ると710S Plus-13ISKと710S-13IKBと710S-13ISKのBIOSは提供の意思があるようだが、710S Plus-13IKBのBIOSはないようだ。

 

これに関してさらに調べると

No Linux BIOS for ideapad 710S "Plus-13IKB"

https://forums.lenovo.com/t5/Linux-Discussion/No-Linux-BIOS-for-ideapad-710S-quot-Plus-13IKB-quot/td-p/3586694

やはり同じ問題を抱えている人がいるようだ。

Solutionに飛ぶと"Why not purchasing laptop from other vendor?"という大変ハートウォーミングな提案がなされている。

 

この時点で一度諦めて電器屋に向かったんですが・・・

よくよく先を見てみると

New bios works GREAT!!!

とか書いてある。

 

(注意:ここから先の作業を行うとwindowsが立ち上がらなくなる可能性がありますのでよく考えてから進んでください)

そこでBIOSのアップデートを行った。

laptops and netbooks :: 700 series :: 710s plus 13ikb - JP

ここから入手できるBIOSを導入

 

BIOSのアップデートができたらBIOS画面に入りSATA controler modeをRAIDからAHCIに変更する

f:id:nabion:20181027214522j:plain

変更しようとすると、なんか恐ろしいことを英語で聞かれるが、強い覚悟でyesを選択する。

 

その他は下記の記事の「3.ubuntuの起動」からの内容と同じ作業です。

qiita.com

これでちゃんと内蔵のSSDubuntuから見えるようになっているはず。

 

 

思い返してみると、こういうトラブル対応の記事は日本語の記事より英語の記事のほうが圧倒的に有用な確率が高いように思える。

Yahoo知恵袋とか質問とお説教しか書いてなくて邪魔でしかない。

 

 

 

推定誤差分散が最小になる推定方法とフィッシャー情報量

おおもとの疑問

未知の値に対して、ランダムな誤差が含まれるのを避けられない測定を何度か行い推定するとき

未知の値はどの程度正確に知ることができるのか?

その正確さを使って、測定が持っている情報量なるものを定義できないか?

 

 

正確な議論をするための定義と状況の簡略化

いま、未知の値\thetaを雑音v_1,\ v_2N(0,\sigma _1 ^2),\ N(0,\sigma _2 ^2)で表される互いに独立な正規分布に従う事がわかっている測定器で2回測定し以下の測定値y_1,\ y_2を得たとする。

 y_1 = \theta + v_1

 y_2 = \theta + v_2

 

このとき、y_1, y_2の線形結合 \hat{\theta } = k_1 y_1 + k_2 y_2,\ (k_1+k_2=1)\theta の推定値とすると、推定の誤差分散 (\theta - \hat{\theta })^2の期待値 E((\theta - \hat{\theta })^2 )を最小にするk_1, k_2をとったとき、その値はいくらになるか?

 

(実はこの問題は雑音の平均値がゼロで分散が有限なことさえ仮定すれば解けるが、あとでフィッシャー情報量を計算するために正規分布を仮定した)

 

計算

  E((\theta - \hat{\theta })^2 )

 E((\theta - k_1 y_1 - k_2 y_2 )^2 )

 E((\theta - (k_1 +k_2)\theta  - k_1 v_1 - k_2 v_2 )^2 )      k_1 +k_2 =1なので

 E(( k_1 v_1 + k_2 v_2 )^2 )    E(v_1)=E(v_2)=0, E(v_1^2)=\sigma _1 ^2,\ E(v_2 ^2)= \sigma _2 ^2なので

= k_1^2 \sigma _1 ^2 +  k_2^2 \sigma _2 ^2    k_2を消去して

= k_1^2 \sigma _1 ^2 +  (1-k_1)^2 \sigma _2 ^2

これが最小になるk_1, k_2を求めるには、k_1微分して0とすればいいので

 k_1 = \frac{\sigma _2 ^2 }{\sigma _1 ^2 + \sigma _2 ^2}

 k_2 = \frac{\sigma _1 ^2 }{\sigma _1 ^2 + \sigma _2 ^2}

このとき

  E((\theta - \hat{\theta })^2 )=\frac{\sigma _1 ^2 \sigma _2 ^2 }{\sigma _1 ^2 + \sigma _2 ^2}

 

これで第一の疑問「未知の値はどの程度正確に知ることができるのか?」についての答えとして

分散の最小値を  E((\theta - \hat{\theta })^2 )=\frac{\sigma _1 ^2 \sigma _2 ^2 }{\sigma _1 ^2 + \sigma _2 ^2}ととるようにできる。という知見を得ることができた。

 

情報量なる抽象的な概念をこのように、「その測定によって、どれだけ正確な推定ができるか」で定義しよう!

・・・というのがフィッシャー情報量である。

 

誤差分散に対して次のクラメールラオの不等式が成立することが知られている

E_{y|\theta }(\theta - \hat{\theta } )^2 \geq E_{y|\theta }((\partial _{\theta } \log p(y | \theta ) )^2 ) ^{-1}

yは測定値全体をまとめたベクトル

E_{y|\theta }は条件付き確率密度分布p(y|\theta)に対する期待値を取ることを意味する。

 この不等式の右辺は、今回の問題のように平均値、分散などを仮定しない一般化した形をしている。

右辺の逆数がフィッシャー情報量と呼ばれる量である。

 

今回の問題に挙げた例を使って、実際に右辺の値を計算してみる。

 \log p(y_1, y_2 | \theta ) = \log p(y_1|\theta ) p(y_2|\theta )=\log p(y_1|\theta ) + \log p(y_2|\theta )   ( y_1,\ y_2は独立)

 p(y_1|\theta ) = A(\sigma _1) \exp (- \frac{(y_1 - \theta )^2 }{2\sigma _1 ^2})       A(\sigma _1) \theta によらない量。あまり興味がない

 \log p(y_1|\theta ) = \log A(\sigma _1) - \frac{(y_1 - \theta )^2 }{2\sigma _1 ^2}

 \partial _{\theta } \log p(y_1|\theta ) = \frac{(y_1 - \theta ) }{\sigma _1 ^2}

同様の計算を y_2にも行うことができる。

また、[(y-\theta )]の奇数次の期待値はゼロなので残るのは

E((\partial _{\theta } \log p(y_1, y_2 | \theta )^2 ) = \sigma _1 ^{-2} + \sigma _2 ^{-2} = (\frac{\sigma _1 ^2 \sigma _2 ^2 }{\sigma _1 ^2 + \sigma _2 ^2})^{-1}

確かにフィッシャー情報量の逆数と推定誤差分散の最小値は一致した。

 

このような計算を一般化して行った結果がクラメールラオの不等式を考えることができる。

 

 

参考

https://www.amazon.co.jp/%E9%9D%9E%E7%B7%9A%E5%BD%A2%E3%82%AB%E3%83%AB%E3%83%9E%E3%83%B3%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF-%E7%89%87%E5%B1%B1-%E5%BE%B9/dp/4254201486

エッジにあるマイコンボードにPCから命令を送る

はじめに

この記事には目的の動作をさせたコードは書いていません。

目的の動作をさせたコードは他人のものです。

私が使ったコードは文中のリンク先を参照ください。

この記事は、そのコードがなぜこう書かれているのか自分なりに考えたお気持ちの表明です。

 

モチベーション

現場で走り回るロボットなりロボアームなりには一定の処理能力があるが

例えば機械学習みたいな重い計算を走らせることは難しかったりする。

また、機械学習機械学習pythonなりで書くとして、ロボット・ロボアーム上で同じコードを走らせる環境を作れるとは限らない。

なので、ハードの制御(サーボモータの制御など)はエッジのマイコンボードに任せて制御の目標値をPCから命令できる状況にしておくと良さそう。

 

やること

話を単純化して、

「PCから命令を送り、arduinoに接続されたLEDをキーボード操作で自由に点滅させる」

という問題を解く

 

答え

qiita.com

恥ずかしげもなく他人のQiitaを貼ります・・・・。

やってることは超シンプルだしね。

 

計測機器との通信と何が違うか?

我々実験系物理屋LabVIEWなりで計測機器にアクセスしてセンサーの値を取得したり

電流源にアクセスして所望の電流を流して試料の温度をPID制御で安定化させたりしていたと思う。

その時、僕らがやっていたのは以下のようなことだと思う

 

「あの装置に命令を送りたいからあの装置のマニュアルをみよう」

「マニュアルには『この文字列を送ったあとにlistenすると値が取れるよ』と書いてある」

「なのでGPIBなりで計測機器に文字列を送信しよう」

 

こういう思考になれきっていた私は

arduinoの端子から電圧を出力させる命令はどういう名前なんだろう」

と考えてしまった。

なんのことはない、arduinoはその「電圧を出力させる命令」を自分で定義しなきゃいけないのだ。

arduino側のプログラミングが必要なのはそういう理由である。

計測機器の場合は普通機器側のソフトはいじくれないので、あらかじめメーカー側で決まった命令を調べて実行することになる。

この点が大きく違うところで、マイコンボードは自由度があってよさだなあと思いました。

毎度毎度マニュアルひっくり返して命令語探すのだるいんですわ・・・。

カルバックライブラ距離・・・?得体が知れないので正規分布で具体例を作ってみる

カルバックライブラ距離とは

p(x),q(x)xを確率変数とする確率分布として以下の式で定義される

\int dx \ q(x) \log \frac{q(x)}{p(x)}

 

カルバックライブラ距離は常に非負で、ゼロになる時は

 p(x)=q(x)のときに限るという性質があります。

※距離の公理は満たさないので、本当は距離と呼ぶべきじゃないかもしれませんが、あえて距離と呼びます。数学的な術語としての「距離」の意味はないです。

 

ものの本によれば、

「真の分布をq(x)、推測の結果をp(x)とすると、カルバックライブラ距離が小さいようなp(x)を持ってくることで真の分布に近い推測が得られるだろう」

とのこと。

 

カルバックライブラ距離を持ってくるモチベーションが全然わからん・・・。

正規分布で具体的に計算してみれば何がやりたいかつかめないかな?

ということで計算してみる。

 

p(x)q(x)正規分布にしちゃう。

p(x) = \frac{1}{\sqrt{2\pi \sigma _1 ^2}} \exp ( -\frac{1}{2\sigma _1 ^2 } (x-m_1)^2 )

q(x) = \frac{1}{\sqrt{2\pi \sigma _2 ^2}} \exp ( -\frac{1}{2\sigma _2  ^2} (x-m_2)^2 )

 

このとき、カルバックライブラ距離は

\int dx \ q(x) \log \frac{q(x)}{p(x)}

=\int dx \ q(x)( \log \frac{\sqrt{2\pi \sigma _1 ^2}}{\sqrt{2\pi \sigma _2 ^2}} -\frac{1}{2\sigma _2  ^2} (x-m_2)^2 +\frac{1}{2\sigma _1 ^2 } (x-m_1)^2 )

 = \log \frac{\sigma _1}{\sigma _2} -\frac{1}{2\sigma _2  ^2} \int dx\ q(x)(x-m_2)^2 +\frac{1}{2\sigma _1 ^2 } \int dx \ q(x)  (x-m_1)^2

 

第1項は2つの分布の分散で決まる項

第2項はこれ、実は定数ですね。(あとで第3項の計算をしたあとで、 \sigma _1 = \sigma 2とするとわかる)

それと3つめ、相手の\sigma,\ mを使って「分散」を計算する項が出てきた。

 第3項をもう少し変形する

 

 \frac{1}{2\sigma _1 ^2 } \int dx \ q(x)  (x-m_1)^2

 =  \frac{1}{2\sigma _1 ^2 } \int dx \ q(x)  (x-m_2 +m_2 -m_1)^2

=\frac{1}{2\sigma _1 ^2 } \int dx  \ q(x) (x-m_2)^2 +\frac{2}{2\sigma _1 ^2 } \int dx  \ q(x) (x-m_2)(m_2 -m_1) + \frac{1}{2\sigma _1 ^2 } \int dx  \ q(x) (m_2 - m_1)^2

 

第1項は正規分布から分散を計算するいつものあの変換で計算できる

第2項は x \to x-m_2の変換をすると被積分関数が奇関数になるのでゼロ

第3項は \int dx  \ q(x) =1なので簡単に計算できる

結局

 

 \frac{1}{2\sigma _1 ^2 } \int dx \ q(x)  (x-m_1)^2

 =\frac{\sigma _2 ^3}{2\sigma _1 ^3}+\frac{ (m_2 - m_1)^2}{2\sigma _1 ^2 }

 

まとめると

\int dx \ q(x) \log \frac{q(x)}{p(x)}

=\log \frac{\sigma _1}{\sigma _2} - \frac{1}{2} + \frac{\sigma _2 ^3}{2\sigma _1 ^3}+\frac{ (m_2 - m_1)^2}{2\sigma _1 ^2 }

 

結論:やっぱりわからん。

計算間違った・・・?(一応q(x) = p(x)ならゼロだが・・・)