カルロスのblog

カルロスのへっぽこエンジニアブログです。

詳解確率ロボティクス6日目_2章_確率分布に基づくサンプリング

2章 確率統計の基礎

2.2 度数分布と確率分布

2.2.4 確率分布

・昨日に引き続きセンサデータから確率分布を作ります

・基本的に本のサンプルコードを見ながら手打ちして追いかけています

f:id:carlos_katayan:20200102145646p:plain

確率分布を作りました
 2.2.5 確率分布を用いたシミュレーション

・前節の確率分布からドローイングしてセンサのシミュレーションを行いました。

f:id:carlos_katayan:20200102145936p:plain

58988データ分回すのは流石に時間がかかりました

2章 章末問題

問題2.1

・章末問題はここまで作ったコードを応用して解きました。

・場合によっては関数化して少し工夫しました。このあたりはC言語での開発経験があってよかったなと思います。

・問題a.~d.でn = 3で標本抽出して標本分散と不偏分散を求め、それを10000回繰り返して分散の平均を取りました。標本分散が16.22、不偏分散が23.71でした。やはりn=3でN数が少ない場合には不偏分散のほうが分散が大きくなるよう補正されているようです。

 

・n = 1000にして10000回回そうとしましたが、シミュレーションに時間がかかりすぎてフリーズしてしまいました・・・とりあえずn=1000で10回回したところ、標本分散が23.26、不偏分散が23.24でした。平均した回数は少ないものの、N数が多い場合には標本分散も不偏分散と近い値になりました。

 

今日のアウトプット

github.com

 

詳解確率ロボティクス_5日目_GithubからのクローンとJupyterでの数式記法

2章_確率統計の基礎

2.1 センサデータの準備

GIthubのリモートリポジトリからローカルにクローンする

・2.1のセンサデータを手元のローカルディレクトリにクローンします

・やり方は以下の方法を参考にしました

help.github.com

 

・以下リンク先のLNPR_BOOK_CODESをローカルにクローンします

GitHub - ryuichiueda/LNPR_BOOK_CODES: Lecture notes of probabilistic robotics

 

・Jupyter Notebookから見てみました

f:id:carlos_katayan:20200101114033p:plain

Documents/Jupyter Notebook下にクローンできました

f:id:carlos_katayan:20200101114902p:plain

sensor_data_200.txtをJupyter Notebookで開きました
センサデータを自分のノートブックで使えるようにする

・手順は本に従って以下のように行いました

1. 自分のディレクトリ(CHapter2)にセンサデータをコピー

2. 同じディレクトリに新しいノートブックを作成

3. Pandasモジュールを使って読み込み

2.2 度数分布と隔離分布

2.2.1 ヒストグラムの描画

・読み込んだデータを使ってヒストグラム化しました

f:id:carlos_katayan:20200101125832p:plain

LiDERのデータをヒストグラム

2.2.3 雑音の数値化

・Jupyter Notebook上で数式も表現してみました。

・以下リンク先を参考にしました。

qiita.com

www.latex-cmd.com

・地味にMacでのバックスラッシュがわからなかったので調べました。

"option"+"¥""\"になりました。

 

f:id:carlos_katayan:20200101225327p:plain

初めてのtex記法できれいに数式が書けました

今日のアウトプット

github.com

 

詳解確率ロボティクス_4日目_1章章末問題その2

1章の章末問題

問題1.3

筒井康隆星新一ショートショートは好きでよく読んでいましたが「パチンコ必勝原理」をまだ読んだことがなかったので、せっかくなのでamazon kindleで購入して読んでみました。

にぎやかな未来 (角川文庫)

にぎやかな未来 (角川文庫)

 

ショートショートなのでサクッと読めました。おもしろかったです。

・「パチンコ必勝原理」がいつ頃に書かれた作品なのか調べてみたところ以下のツイートによると1967年8月ごろのようです。

 ・60年代のパチンコと言うと下の動画の冒頭に出てくるような手打ち式のものになります。


懐かしのパチンコ名機集 「第1巻」

 

・私はスロット(ジャグラー)しかやったことがないので現代のパチンコすらあまりよく知りませんが、この頃のパチンコは役物に入る調整は釘の角度などを直接たたいてやっていたと聞きます。

・博士は1000円分の玉を買い、主に以下の情報について持参した測定器具を用いて調べました。

 ・台の状態(傾斜、釘の間隔、ばね定数など)

 ・玉の情報(直径、体積、重さ、密度など)

 ・店内の情報(明るさ、温度、湿度、気流、気圧など)

・小説ではここに載せた以上にたくさんのデータを測定し、機械式のピストンで玉を打ち出しましたが結果は。。。という結末でした。

 

・それではどのような情報があれば勝てたのか、3つの観点から考えてみます。

 

1. 測定方法の精度は担保されていたのか?

・そもそも測定方法の精度が担保されておらず、正確なデータが測定できなかった

・博士が測定方法を誤っていた(ノーベル賞受賞者とはいえ実験の現場から長年離れていたため)

・途中で食べた昼食やお茶で体調を崩して計算を誤っていた

→精度良く測定できていれば勝てた

 

2.計測後の時間的な変化を考慮すべきだった?

・ 測定を進めるうちに野次馬がどんどん増えたため環境が変化したことを考慮してデータを取り直すべきだった(気温や湿度の変化による台や玉の変形など)

・野次馬が増えすぎたため店が微妙に傾斜して、店が水平だという前提が崩れた(カイジがパチンコ沼編で水タンクを使ってビルを傾けた的な)

・玉を打ち続けたことで微妙に釘の角度が変化していた

→上記の影響を考慮して補正していれば勝てた

 

3. パチンコで勝つ人がどのようにして勝っているのか調べるべきだった?

・レバーを直線的な力の掛け方(=機械式のピストン)で弾いてはうまく入らなかった(上手い人はいい感じに指先の感覚を使っているかも)

・勝つための流れを掴む方法があった(10000円以上つぎ込めば勝てる、赤ふんどしをするなど験担ぎをすると勝てる)

→物理的な情報だけでなく、パチンコに勝つ人の情報も集めていれば勝てた

ちなみに辞めるふり作戦などオカルト必勝法はいろいろあるようですね。

biz-journal.jp

・ざっと以上のように考えてみましたがどうでしょうか?

・測定精度の誤差や環境の時々刻々な変化はロボットを制御する上でも効いてきそうな要素だと思います。また験担ぎやオカルトなどもバタフライエフェクト的に実は効いているのかもしれません。

詳解確率ロボティクス_3日目_1章章末問題その1

1章の章末問題

問題1.1

・問題1.1に取り組んでみました。せっかくなのでPythonとJupyter Notebookの練習もかねてコードを書きました。

・問題の解釈の仕方が難しいですが、今回はAさんは1に賭け続け、Bさんはその時点で最も出現回数の少ない出目に掛けるアルゴリズムを仮定しました。

・最終的な回答はページ最後のリンク先にあります。

サイコロをランダムに振る

・サイコロをランダムにふるコードについては以下リンクを参照しました。

qiita.com

出目の出現回数の最小値を手に入れるには

・以下のリンク先を参考にNumPyのargminを使いました。

deepage.net

途中経過も見たい

・最初は設定した回数(10000回とか)ふって出た回数をカウントしてましたがもちろんサイコロなので回数が多いほど1/6に近づきます。しかし回数が少ないうちは偏りがあり、それによってAさんとBさんの獲得賞金も違ってきます。

・なので10回目、100回目、1000回目、10000回目の各時点で途中結果と確率分布のグラフを出力するようにしてみました。

・複数のグラフを並べるやり方は以下リンク先を参考にしました。

qiita.com

出力してみた

・以下が出力になります。

f:id:carlos_katayan:20191230170819p:plain

Jupyter Notebookで出力してみた

・コードを実行し直すたびにある程度結果は変わります。

・20回ほど実行した際にはAさん11勝、Bさん8勝、引き分け1回でした。

・教訓としては

1. ある一定の金額を手に入れるならば一つの目に賭け続ける

2. 獲得賞金が少なくなるリスクはあるが、最大限増やしたいときは回数の少ない目を狙う

といったところでしょうか。

・今回はBさんの考え方を「すべて1/6の確率ならこれまでの出現回数が小さい目を狙うべき」というふうに仮定したのでこの様になりました。他の方の考え方や意見も是非聞いてみたいです。

 

今日のアウトプット

github.com

 

詳解確率ロボティクス_2日目_Jupyter NotebookからGithubへのアップロード

 Githubリポジトリ名の変更

・後になって気づいたのですがリポジトリ名を間違えていました

・確率ロボティクス = Probabilistic Robotics = PR なのに何故かpmとつけていました…

・ということでGithubリポジトリ名を変更します。変更したいリポジトリに移動すると以下の画面になります。右上のSettingsを押します

f:id:carlos_katayan:20191229214717p:plain

すでに変更後で恐縮ですが、右上の歯車マークに付いたSettingsを押します

・Settingsに飛ぶと以下画面となり新しいリポジトリ名を入れて変更できます

f:id:carlos_katayan:20191229215417p:plain

新しい名前を入れてRenameします

・同時に昨日は良くわからなかった RAEDME.mdファイルを更新してみました。

・.mdファイルとはマークダウンファイルのことで以下リンク先を参考に変更しました。

codechord.com

・README.mdを更新するときは右側の鉛筆マークを押して編集画面に移動します。

f:id:carlos_katayan:20191229220643p:plain

編集画面。とりあえず#をつけると見出しになります

・編集したら下にスクロールして今回の変更をコミットします。

・コミットとはリポジトリへのファイルやディレクトリの追加・変更を記録することです。変更点とその詳細を書いてコミットしました。

f:id:carlos_katayan:20191229220925p:plain

今回の変更点を"Update README.md"にしてその説明を下の欄に書きました

・他の方のリポジトリを見るとREADME.mdはプロジェクトやツールの説明、目次、インストール方法、使い方、宣伝などを記していることが多く、最初に目に付く部分になります。ここを丁寧に記述することが他の人に見て使ってもらえるかどうかという点でかなり重要な要素と言えます。

 

Jupyter NotebookからGithubへのアップロード

・やっと本題です。今日はJupyter Notebookでサンプルコードを作って、Githubへアップロードしてみます。

Jupyter Notebookでサンプルコードのファイルを作る

・Jupyter Notebookの使い方は以下のリンク先を参考にしました。

ai-inter1.com

 ・AnacondaからJupyter Notebookを開くとブラウザ上に以下のような画面が開くのでファイルを作りたいフォルダに移動します。また右の"New"というところからFolderを選ぶと新しいフォルダを作れます。

f:id:carlos_katayan:20191229224431p:plain

Documents/Jupyter Notebook/Saampleというフォルダをつくりました

・ 右の"New"からPython3を選ぶと新規ファイルを作成できます。

・先程のリンク先のサンプルコードを貼り付けてみました。

f:id:carlos_katayan:20191229224820p:plain

サンプルコードをすでに記述したものがこちらになります

・普段はC言語を使っているのですがPythonはあまり分かりません。ライブラリを使いこなすべしと先輩から教わったのでライブラリ超大事!というイメージです。まあやりながら勉強していきましょう。

・個人的にはCのようにコンパイルして実行ファイルを作らずにそのまま実行するインタープリタ方式に感動しました。あと変数を型宣言しなくていいのもすごいですね。

 

・左上のFile>Rename…で名前をuntitledから変更できます。またJupyter Notebookは適期的に自動保存されますがSaveを使って手動保存もできます。

 

Githubへのアップロード

Githubへのアップロードは以下リンク先を参考にしました。

pppurple.hatenablog.com

・Jupyter Notebookで作ったファイルは.ipynbという拡張子のものになります。要はこれをそのままアップロードすればいいんですね。楽勝です。

・しかしGithubで新しいディレクトリを作るのがちょっと分かりにくかったです。New folderなどのボタンがありません。"Create new file"を押してファイルを作成する際にスラッシュ( / )を使うとフォルダとして区切ることができます。

・今回はPM_trainingの下にSampleというフォルダを作りつつREADME.mdファイルを置くことで新しいフォルダを作りました。すなわち、

/Sample/README.md

と入力してSampleフォルダを準備しました。

・あとはこのフォルダに"Upload files"からファイルを追加してアップロード完了です。

 

今日のアウトプット

github.com

 

 

詳解確率ロボティクス_1日目_環境構築

まずはツールの準備

・本書1.3.3より必要なツールとして以下の3つが挙げられています。

1) Jupyter Notebook (ブラウザ上でプログラムを記述、実行できるツール)

2) Python v3.7 (プログラミング言語)

3) GitHub (コードを公開したり閲覧できるウェブサービス)

 

(1)と(2)についてはAnacondaがおすすめされていますのでまずはAnacondaをインストールします。ちなみに私のマシンはMacなので以下記事もそれに基づいて記述します。

 

Anacondaのインストール(Mac向け)

・Anacondaのサイトにアクセスします

www.anaconda.com

・上のリンクからアクセスするとすでにMac OSが選択されているはず。Mac以外の場合は他のOSのアイコンをクリックしてからver3.7をクリックしてダウンロード

f:id:carlos_katayan:20191228152255p:plain

上段でOSを選択したあと、ver3.7をクリック

・ダウンロードしたpkgファイルを実行してインストール。以上で完了です

・Anacondaを開くとこんな感じ。ちゃんとJupyter Notebookもありますね

f:id:carlos_katayan:20191228152636p:plain

Anacondaを開いたところ。いろいろソフトがあってなんだか楽しそう

Githubのアカウント作成

・次にGithubのアカウントを作ります。実はこれまで業務ではTortoiseGitを使ってプロジェクト管理をした経験はあるのですが、Githubにアカウントを作るのは初めてです。

・まずはGithubのサイトへアクセスしてアカウント登録します。

github.com

・登録していくとプランを選ぶことになりますが、とりあえずFreeプランにしました。

・登録完了後、リポジトリの設定をします。リポジトリとはファイルの状態を保存する場所のことで、ここにプロジェクトを保存し、変更をアップロードしていきます。

リポジトリ名をつけ、publicを選択(freeプランはpublicのみ)、initialize~READMEはよくわからないですが初めて作るのでチェックを付けておきました

f:id:carlos_katayan:20191228163111p:plain

pm_trainingとリポジトリ名をつけ、initialize~READMEにチェックを付けた

・これで自分のリポジトリができました。

・サンプルコードがある著者の上田隆一さんのリポジトリは以下リンク先です。

github.com

 

 ・とりあえず今日はここまでにします。Jupyter NotebookとGithubの使い方も調べながら章を読み進めていきたいと思います。

 

詳解確率ロボティクス_0日目

確率ロボティクスの勉強がしたい

・猫も杓子もやれCASEだ、5Gだ、AIだと騒がしい令和最初の年の瀬ですが、確率ロボティクスを勉強したいのです、僕は。

・そもそも「確率ロボティクス」ってなんぞ?ってことで以下の説明をamazonより引用します。

「確率ロボティクス」は、環境やシステムが持つ「不確実さ」(予測不可能な事象)に確率・統計を駆使して対処するのを特徴とする分野です。人の作業空間により近い位置への進出を期待される次世代のロボットでは、この分野のアルゴリズム設計は有力な枠組みの1つとして注目を集めています。また、ロボットのみでなく、自動車の自動走行などへも応用可能な分野です。

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

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

 

・確率とロボティクス?なんだかかっこいいな!(アホ丸出し) 

・今年の頭に部署の先輩がこの書籍を持っていたので、「先輩何読んでいるんですか〜?僕にも見せてくださいよ〜」と試しに読んでみましたが正直難しくて理解することができませんでした。

・自動運転など制御系と機械学習の両方にまたがった領域を以前から勉強してみたかったのですが、この本を読んだときには「自分には手に負えないかもしれない…」と不安になってしまいました。

 

なんかよさそうな本が出た!

・それからしばらく経ち、ツイッターを眺めているときに「詳解確率ロボティクス」の情報が流れてきました。

 ・この本は以下の3点から私にとって非常にありがたいものでした。

 

1) 実習しながら学べる

→手を動かしながら学びたい派の私にとって非常にありがたい

 

2)確率統計の基礎も抑えている

→確率統計をほとんどやったことない私にとって非常のありがたい

 

3)サンプルコードや実習にはPythonを使用している

→これまでC言語でしか開発をしたことがなく、Pythonも身につけたいと思っていた私にとって非常にありがたい

 

・というわけで早速予約し、先日手元に本が届いた次第であります。

詳解 確率ロボティクス Pythonによる基礎アルゴリズムの実装 (KS理工学専門書)

詳解 確率ロボティクス Pythonによる基礎アルゴリズムの実装 (KS理工学専門書)

  • 作者:上田 隆一
  • 出版社/メーカー: 講談社
  • 発売日: 2019/10/27
  • メディア: 単行本(ソフトカバー)
 

 

できるだけアウトプットを公開していきたい

・本書でも推奨されていますが自分で作成したコードをGithub上で公開していく予定です。またPythonGithub等の環境設定やコーディングでつまずいたところなどもできるだけ記事にしておこうと思います。

・目標としてはまず本書をやりきりたいです。さらに実際にメカとハードウェアを組み立てて、本書で獲得した知識をもとに自分なりの自動運転ロボット開発等ができれば万々歳といったところです。

・とりあえず、1日目からはPythonの環境設定から記事を書いていきますのでよろしくおねがいします。