いものやま。

雑多な知識の寄せ集め

もうPythonで迷わないために。(その1)

データ分析しようと思ったらデファクトスタンダードになっているのがPython。 実際、データ分析に使えるライブラリも充実しているし、Jupyterという使い勝手のいい環境もある。 言語自体も(洗練されてはいないけど)シンプルで、流行っているので本やWeb上にも情報がたくさんあり、プログラミング自体にはあまり興味がない人にはかなり取っ付きやすい。

一方で、変化が激しかったり、流行って多くの人が使うせいか、情報が玉石混交であったり、似たような仕組みがいろいろ乱立していたりと、その理念(1つのことはただ1つのやり方でだけできる、誰が書いても同じようになる)に反して、こういうときはどうすべきなんだろうと迷うことが多い。

それに関して、実際に仕事で使っている中で「こうすべき」というのが見えてきたので、まとめておきたい。

結論

とりあえず、結論だけ。

  • どのPythonを使うべき?
    • Python3系を使う
    • 公式のPythonを使う
  • パッケージ管理や仮想環境はどうすべき?
    • 公式のvenvを使う
    • Jupyterを動かす汎用の仮想環境と、各プロジェクト用の仮想環境を用意する
  • 開発環境は何を使うべき?
    • おすすめはJupyterLabのver3.1以上(通常のカーネルでデバッガが使える)
    • 各プロジェクトの仮想環境はカーネルとして追加する
  • プロジェクトの構成はどうすべき?
    • pyproject.toml, setup.py, setup.cfgを置いてビルド可能にする
    • requirements.txtを使わない
    • パッケージ名のフォルダ、使用例を置くexamples/単体テストを置くtests/を用意する
    • formatter, linterとしてpysenを使う
  • コードはどう書くべき?
    • たくさんありすぎるので今回はスコープ外

ただ、いろいろ書いたけど、一番のベストプラクティスは「Pythonを使わなくて済むなら使わない」だと思う。 Pythonは設計が悪すぎて、使えば使うほどストレスが溜まっていくので。。。

どのPythonを使うべき?

さて、まずは「そもそもどのPythonを使うべき?」という問題。

正直、この疑問がまずついて回る時点で、もうすでに異常。 これだけでPythonを使うべきではないとなってもおかしくない。

背景を説明しておくと、Pythonには2系と3系があり、2系から3系にバージョンアップしたときに互換性が切れる変更が入ったため、そのときすでにコード資産の溜まっていた2系を使い続けるのか、労力を割いて3系に対応するのかという話があった。

幸い、10年強(!)かけて3系への移行が世界的に進み、2020年になってようやく2系が正式に廃止へ。 なので、今は迷わず3系を使えばいい。

ただ、2系か3系かで話が終わればよかったものの、残念ながらまだ問題がある。 それはどのディストリビューション(配布)を使うのかという問題。

Pythonには公式が配布しているものの他に、Anacondaという有名な配布がある。 この配布にはデータ分析に使うパッケージが最初から入っているので、パッケージのインストールでつまずくことないというメリットがあった(昔はインストールでコケることが多かった)。 また、仮想環境を作って管理したり、condaと呼ばれる独自のパッケージ管理システムがあったりといった特徴があった。 なので、データ分析するならAnacondaを入れておけばいいという風潮があったりした。

けれど、それも昔の話。 今となってはAnacondaを使う理由はほとんどなく、むしろ害悪とも言える。

  • ほぼすべてのパッケージはpipで問題なくインストールできる
  • 仮想環境は公式のvenvで十分
  • condaとpipの両方があると紛らわしくて管理が難しくなる
  • ライセンスの関係でフリーで使える人は限られる

ライセンスは本当に注意が必要で、自分も勉強会で初めて知った。 気にしてなかった人は確認した方がいい。

ちなみに、他にも配布はあり、自分が見たツイート(現在では削除されてた)では次のようなものも:

今年の新人ちゃんが「Homebrewで入れたModellerが動かない😢」と報告してきてくれたのですが、チャットで全然解決できないので最終手段で新人氏のマシンを遠隔操作させてもらって画面を見たところ、そこにはAnacondaとPyenvとHomebrewとpkg版Pythonの4つが混在する魔境になっていたことがわかった。

これは酷い。。。

こうならないためにも、公式で配布しているものをインストールするのが一番安全だし、分かりやすい。

まとめると、以下:

  • Python3系を使う
    • Python2系は使わない
  • 公式のPythonを使う
    • Anacondaや他の配布は使わない

もちろん、このように書くと「じゃあPython3.7と3.8を使いたい場合、どうするの?」とかも出てくると思う。 それについてはまた次回。

今日はここまで!

muuteを使ってみた。

muuteというアプリが面白そうだったので使ってみた。

muute (ミュート) - AIジャーナリング

muute (ミュート) - AIジャーナリング

  • ミッドナイトブレックファスト株式会社
  • ヘルスケア/フィットネス
  • 無料

けど、実際に使ってみるとちょっと自分とは合わない感じだったので、使うのを止めた。 その辺りのことを書いてみたい。

どんなアプリ?

すごくざっくり言ってしまうと「個人専用ツイッター」。

そのときどきに思ったことを感情やカテゴリと一緒に呟く。 すると、感情の動きがどう変わっていったかや、どんなカテゴリのことに興味があったかなどが記録されていく。 それをあとから見返すことでいろいろふりかえりができて、また、AIで分析してくれることで傾向やアドバイスがもらえたりする。

気持ちを吐き出せて、しかも他の人には見られないので、気持ちをサッパリさせたりできる。 また、嬉しかったこととかを記録しておけば、あとで見返して楽しい気持ちになれる。

「言葉にすること」の力が得られることや、ふりかえりに使えること、それとAIでの分析が見れるとかが興味深く、さっそく使ってみた。

面白かったこと

面白かったのは、週末、月末に送られてくる「インサイト」。 その週/月での呟きをAIが分析したレポートで、これを読むのがけっこう楽しかった。

感覚としては、占いが送られてくる感じ。 送られてきたレポートを見て「あってるな」「ちょっと違うな」みたいなのを感じながら、自分のことをふりかえられるのは面白かった。

あと、このアプリの本質とはちょっと違うんだけど、移動ログを見ることができて、個人的にはこれがすごく楽しかった。

リモートワークの運動不足を解消するために、昼休みに自宅の周りを30分くらい散歩するようにしてるんだけど、日によって少しルートを変えたりしてて、それをあとで見返すとちょっと楽しい。 車で少し出かけたりするとそれもログとして残るので、「こういう移動したよな」とか。 (宝川への移動ログとか)

残念だったこと

一方で残念だったことも。

まず、感情やカテゴリを選択するのが思ったよりもストレスだった。 呟こうと思って文章を入れたあと、画面遷移してまずは感情、そしてさらに画面遷移してカテゴリを選択するんだけど、ただ選ぶだけなのに微妙にストレス。

感情選択は「自分の今の感情はこれだな」というのを複数の選択肢(24種類)から選ぶというものなんだけど、これが微妙にダルい。 単純に点数とかならえいやで選べるけど、たとえば「満足」「感謝」「スッキリ」「退屈」「恐れる」「嫌い」みたいに微妙にベクトルが違ってるような複数の感情から選ぶとなると、毎回「どれだろ・・・これが近い感じするけど、なんか微妙に違う感じもするし・・・」みたいなのが生じて、これ自体がストレス感じて「イライラ」を選びたくなる始末。

カテゴリを選ぶのも、選択肢が自分に合っていない感じが強くて、たとえば「バイト」とか「美容」なんて選ぶことないだろう一方、「アニメ」とか「プログラミング」とかはなくて、「どのカテゴリにしよう・・・」みたいなストレスが。 一応、その他のカテゴリを追加したりもできるんだけど、デフォルトの選択肢が邪魔で、もっとカスタマイズさせてほしかった。

あと、呟くタイミングが意外と難しいというのも。

たとえば、ガチャでいい引きがきて「よっしゃ」と思ったときとか呟きポイントだけど、それだったらツイッターに画像付きで呟きたいところ。 ツイッターにも呟いてこちらにも呟いてとかだと面倒。 かといって、こちらにしか呟かないとちょっと寂しい・・・(ツイッターで自慢したい感

自分の場合、割と何でもツイッターに呟いてしまうので、そこからこぼれ落ちるようなものくらいしか呟きようがないとなると、かなり内容が限られてしまう。

そこで、一日の終わりにふりかえりみたいな感じで呟こうかなとしてたんだけど、そうすると感情とかカテゴリの選択がますます難しい・・・

それと、週終わりに毎回ふりかえりをしてるんだけど、muuteで呟いた場合、どんなことがあったのかを確認するのにGithubプロジェクトボードとmuuteの両方を見ないといけないので、これも地味に面倒・・・

他、細かいことだけど、週を月曜日始まりにできないのはちょっとという感じだった。 土日が週末なわけで、週の始まりは月曜日でしょ。


とまぁそんな感じで、自分には合ってなかったので使うのを止めた。

自分の場合、呟くのはツイッターで十分だし、そのレコーディングもTwilogでできてるので、このアプリがとって変わるだけの需要がなかった。 また、感情やカテゴリの選択が自分に合ってなくて、それをカスタマイズできなかったのも痛かった感じ。

ただ逆に言えば、普段あまりツイッターを使ってなくて、感情やカテゴリがあってる人には、オススメできるアプリだと思う。 インサイト自体は面白いし。

自分のようなツイ廃だと、ツイッターの呟きをAIが自動で分析して感情の変化とかを見せてくれるとかのサービスだったら、既存アプリとぶつからずに機能を拡張してくれる感じになってたので、よかったんだろうなぁ。

今日はここまで!

muute (ミュート) - AIジャーナリング

muute (ミュート) - AIジャーナリング

  • ミッドナイトブレックファスト株式会社
  • ヘルスケア/フィットネス
  • 無料

宝川温泉に宿泊してきた。

夏休みを使って宝川温泉に行ってきた。

f:id:yamaimo0625:20210811225359p:plain

宝川温泉にはこれまでも何回か行ったことがあって、このブログでも紹介してきた。

ただ、これまでと違うのは、日帰りではなく宿泊したということ。 これで料理を楽しんだり夜のお風呂を楽しんだりすることもできた。 今回についていえばこれが大正解だった。

それと、これまでは電車で水上まで向かい、そこからは自転車やバスを使っていたけど、今回は自宅から車で向かったというのも新しかった。 車で向かうのは一長一短あるものの、いい経験だった。

行程

行ったのは8月8日〜10日で2泊3日。

自宅を出て高速に乗り、約3時間走って水上ICへ。 降りてすぐの道の駅で軽くお昼を食べて、そこから1時間前後走って宿に到着した。

f:id:yamaimo0625:20210811225421p:plain
道の駅から

f:id:yamaimo0625:20210811225444p:plain
1日目のお昼

宿では食事やお風呂を楽しんだり、部屋でまったりと過ごしたり。 2日目は少し散歩とかもしたかったんだけど、なんかクマが目撃されてるとかで自重・・・

f:id:yamaimo0625:20210811225515p:plain
部屋から眺めた宝川

そして3日目はチェックアウトしたら谷川岳ロープウェイに足を延ばした。 そして、水上まで戻ってきたらお昼を食べて、再び水上ICから高速に乗って帰った。

こんな感じで、自由に使える足があったので行動の自由度は高かった。 一方で、電車なら景色を楽しむ余裕があったけど、車だと運転に集中しないとなので、景色を楽しむ余裕がなかなかなかったのが難点。

金額的に見ても、電車なら片道3,000円弱というところだけど、車だと高速が片道3,500円弱とガソリン代1,500円弱で合計5,000円弱なので、ちょっとだけ割高だったかも。 いや、何人かで行けば得なんだろうけど。 (※今回も一人旅)

お風呂

さて、宝川温泉といえば、広々とした開放感あふれる露天風呂。 着いてさっそくウキウキ気分で向かったんだけど、今回はちょっと大変だった。

何がって、大量のアブ!!!

尋常でないほどアブが大量発生していて、これにはホトホト困り果てた。 フロントでも一言もらってたけど、まさかこれほどとはという感じ。

脱衣所で服を抜いて腰巻きをつけてたら、さっそく右脚を噛まれて痛みで飛び上がった!  もう次から次へと噛まれて痛い痛い(^^;  まるでトイレを我慢している子供かのように脚を交互に踏み交わし、とにかくじっとしていないようにした。 それでもどんどん寄ってくる。。。

そして湯船に浸かっても顔の周りにブオンブオンと羽音を響かせながら飛んでくるもんだから、全然落ち着けない。 タオルでこう追い払いながらなんとかしようとしたけど、いかんともしがたかった。

ただ、今回は泊まりだったのが不幸中の幸い。

まず、内湯の大浴場は問題なく使えた。 こちらも源泉掛け流しなのでお湯は最高。 当然、室内にはアブもいないので、落ち着いて入ることができた。

また、アブは昼行性らしく、夜は全然飛んでいなかったので落ち着いて露天風呂に入ることができた。 夜の露天に入れたのは泊まりだからこそ。 本当に泊まりでよかったと思う。

料理

そして、料理もよかった。 夕食、朝食、どれも量もたっぷりで、しかも美味しかった。 猿ヶ京温泉に行ったときに麦豚のトンカツが美味しかったと書いたけど、群馬のお肉は美味しいね・・・

f:id:yamaimo0625:20210811225601p:plain
1日目の夕食

f:id:yamaimo0625:20210811225631p:plain
しゃぶしゃぶ美味かった

f:id:yamaimo0625:20210811225722p:plain
1日目の夕食(追加の品1)

f:id:yamaimo0625:20210811225752p:plain
1日目の夕食(追加の品2)

f:id:yamaimo0625:20210811225909p:plain
1日目の夕食(デザート;こんにゃく!)

f:id:yamaimo0625:20210811230009p:plain
2日目の朝食(その1)

f:id:yamaimo0625:20210811230034p:plain
2日目の朝食(その2)

f:id:yamaimo0625:20210811230058p:plain
朝食を食べてたら猿が!

f:id:yamaimo0625:20210811230129p:plain
2日目の昼食(お弁当)

f:id:yamaimo0625:20210811230230p:plain
2日目の夕食

f:id:yamaimo0625:20210811230258p:plain
2日目はステーキでこれも美味かった

f:id:yamaimo0625:20210811230346p:plain
2日目の夕食(追加の品1;うなぎ!)

f:id:yamaimo0625:20210811230517p:plain
2日目の夕食(追加の品2)

f:id:yamaimo0625:20210811230546p:plain
2日目の夕食(デザート)

f:id:yamaimo0625:20210811230834p:plain
3日目の朝食

藤原ダム

今回は車で向かったので、藤原ダムも近くに車を停めてじっくりと見ることができた。 新型コロナの影響でダムカードの配布が中止されてたのは残念だったけど。

f:id:yamaimo0625:20210811231130p:plain
藤原ダム

f:id:yamaimo0625:20210811231609p:plain
力強い・・・

谷川岳ロープウェイ

せっかくこっちの方まで来たので、谷川岳ロープウェイにも乗ってみた。 まぁ、雨で景色とかは全然見えなかったんだけど(^^;

f:id:yamaimo0625:20210811231209p:plain
ロープウェイ

f:id:yamaimo0625:20210811231231p:plain
雨風が凄かった・・・

f:id:yamaimo0625:20210811231255p:plain
道中で見えた滝

f:id:yamaimo0625:20210811231321p:plain
天神平から

f:id:yamaimo0625:20210811231437p:plain
何も見えない・・・残念

雨ニモマケズ

谷川岳から水上に戻ってきて、高速に乗る前に行ったのが「雨ニモマケズ」というお店。

f:id:yamaimo0625:20210811231656p:plain
雨ニモマケズ

ここのウリは、めんつゆで食べるしゃぶしゃぶ! 観光マップに載っていて気になったので入ってみたんだけど、大正解だった!

頼んだのは、やまと豚、赤城豚、麦豚が楽しめる、プレミアムポークセット。

f:id:yamaimo0625:20210811231728p:plain
めっちゃ贅沢なプレミアムポークセット

f:id:yamaimo0625:20210811231759p:plain
やまと豚&赤城豚&麦豚

f:id:yamaimo0625:20210811231933p:plain
しゃぶしゃぶしたお肉をめんつゆで

どの豚さんも美味しかった・・・(恍惚

めんつゆでのしゃぶしゃぶというのは初めてだったけど、優しい味わいで豚の旨さを引き立ててくれる感じで、とてもよかった。 やっぱり群馬はお肉が美味しい・・・

野菜も美味しかったし、締めの麺もいい感じで、大満足。 また水上に来ることがあれば、次回も来たいな。

今日はここまで!

技書博5にサークル参加してきた。

6/19(土)にサークル「いもあらい。」として第五回技術書同人誌博覧会に参加してきたので、その感想とか。

以前の参加の様子は以下から:

感染対策とか

今回は久々のオフラインイベントだったけど、感染対策でこれまでのイベントとはいろいろ違ったなというのが感想。

前回(技書博2)のときも(感染対策とは関係なく)混雑対策をしていたので、人が混み合うことなく快適な空間になっていた。 今回はそれがさらに推し進められて、表現は悪くなってしまうけど「ガラガラ」だった。 これだけ人流を減らせるんだというのは、正直驚き。 これなら感染のリスクはかなり下げられていたんじゃないかなと思う。

ちなみに、机も1卓を1サークルがまるまる使う感じ。

f:id:yamaimo0625:20210620194650p:plain

とても広くて快適だった・・・

机の間もかなり間隔がとられていて、誰かが言っていたけど、とても贅沢な空間の使い方だったと思う。

他にも、入場時に手の消毒をするのはもちろん、入場時間ごとにリストバンドの色を分けて会場に滞在している時間を調整したり(最大90分になるようにしていた)、サークルへのインタビューも無言で行ったりと、とても念入りな感染対策が行われていた。 スタッフさんには感謝の念しかない。

買い物>店番

ちなみに自分はというと、そんな感じだったので、店番はかなり暇だったw なので、本を読んだり、休憩がてら他のサークルさんを見て回ったりしてた。 たぶん店番してるよりも買い物してる方が楽しさの比重は大きかったかもw

やっぱり久々のオフラインイベントということで、買い物するのは楽しい。 自分の場合、見本紙を実際に手に取って中身を確認して、買った物理本が手にあり、そしてすぐ読めるというのが嬉しい感じ。 会場を歩き回っていろいろ見て回れるのも好き。 このあたりはオンラインだとなかなか難しいんよね。

買った本

それほど冊数も多くないので、せっかくだから買った本の紹介。

エンジニアのための英単語辞書

自分はプログラミングで命名こそが重要だと思ってるので、購入。

正直、少し物足りないかなという気はしないでもない。 単語数とか使い分けとか。 けど、とりあえず基本を確認するのにはよさそう。

異世界Git

エモい。

これから読む人のためにちょっと補足しておくと、最初の主人公は10代半ばの女の子。 描画の少なさもあってか、自分は途中まで20代くらいの若い男性だと勘違いしてた。 それだとエモさが激減するので注意。

確率で競馬は勝てるのか?

「ギャンブルで絶対に負けない方法がある・・・負けたら倍賭けを勝つまで繰り返すんだよ!」というのを実際にやっちゃいましたという本w どうなったのかは読んでのお楽しみw

こんなことでも実際にやってみるといろいろ知見が得られるんだなというのが面白かった。

Linuxへ入門するための手引き

あらかじめ書いておくと、ただLinuxが使えるようになりたいという実用性重視の場合には、あまりオススメできない(^^; 一方で、哲学とか歴史とかが好きな人は、そういった脇道の話がコンパクトにまとめられているので、楽しんで読めると思う(もちろん自分は後者)。

なんだろうね、こういう脇道の話って初心者を迷わせないという意味ではあまり書くべきではないとも思うんだけど、単純にそういうのを楽しめる余裕があってもいいとは思う。

高校で習う統計学

今は高校でも統計をやるんですよ、ということで、へぇと思って購入。

読んでるうちに、そういえば確率変数とか平均とか分散とか自分も高校でやってたなぁというのを思い出した。 それが統計という意識はほとんどなかっただけで。

ただ、さらに分布とか推定とかも範囲に入ってる感じっぽい。 そこらへんはさすがに高校ではやってなかったので、高校生大変だなぁという感じ。

スケジューリング問題のおはなし

スケジューリング問題もいろいろあるけど、扱ってたのは「キャンセル料を支払えば仕事をキャンセルできますよ」というものw その発想が面白いw そして、キャンセル額の上限があるときに、できるだけ早く仕事を終わらせるには、どの仕事をキャンセルして、どの仕事から取り掛かるといいのか、というのを議論してた。

解法としては動的計画法を使っていて、動的計画法の例としても参考になった。

宣伝

ちなみに、自分が技書博5で頒布した本はBOOTHから購入できるので、ぜひ。

今日はここまで!

ベイズ統計学を学んでみた。(その9)

前回は条件付き確率分布を定義した。

今日は、後回しにしていた分母が0の場合について議論しておきたい。

分母が0になる場合に関して

あらかじめ断っておくと、これに関しては自分もまだ明快な答えが出せていない。 そのうえで、どんなことを考えているか書いておく。

定義を見れば分かる通り、周辺確率分布 P\langle Z\rangle (z)が0になるような zでは、0で割り算することになってしまうので、非常に問題がある。

これを解決するためにまず考えられる方法は、2つ:

  1. 分母が0になる場合は別の定義をする
  2. そもそも分母が0にならないように \overline{Z} = \{z \in Z | P\langle Z\rangle (z) \gt 0\}を定義域とする

別の定義を考える場合

まず、前者について。

一番単純に思いつくのは、 P\langle Z\rangle (z)= 0となる zに対しては、 P\langle X, Y\rangle[Z](x, y | z) = 0とする定義。

ただ、これはすぐに問題があると気づくと思う。 実際、 X, Yについて積分したときに、その値が1になってくれない。

他の定義として考えられるのは、周辺確率分布を条件付き確率分布にするというもの。 すなわち、 P\langle Z\rangle (z)= 0となる zに対しては、 P\langle X, Y\rangle[Z](x, y | z) = P\langle X, Y\rangle(x, y)と定義する。

こうした場合は、 X, Yについて積分した値もちゃんと1になるので、前回示した P\langle X, Y \rangle [Z]が確率変数 X, Yに関する同時確率分布になっているという命題が維持される。 さらに嬉しいことに、独立性に関する議論で P\langle Z\rangle (z)= 0となる場合を考慮する必要がない。 (独立性に関してはそのうち)

なので、一見これでよさそうに思えるんだけど、実はそもそも論で問題がある。 これは後者とも関係してくるので、あとでまとめて議論する。

定義域から外す場合

さて、後者について。

そもそも確率分布の値が0になるような事象が定義域に入ってるから問題なのであって、その事象を取り除いても全体を積分した値は変わらないのだから、そんな事象は定義域から外してしまえ、というのは、自然な発想にも思える。

けど、次のような例を考えてみると、やっぱり問題があることに気づく。

コインと袋の例

次のような例を考えてみる。

まず、2つの袋があるとする。 1つ目の袋には赤玉が2つ、白玉が1つ入っていて、2つ目の袋には赤玉が1つ、白玉が2つ入っているとする。 そして、コインを投げて表が出れば1つ目の袋から、裏が出れば2つ目の袋から、玉を1つとるとする。

さて、袋から玉を1つとったときの確率変数が X = \{\text{赤}, \text{白}\}、コインを投げたときの確率変数が Y = \{\text{表}, \text{裏}\}とすると、コインが表のときの Xの確率分布 P\langle X\rangle [Y](x|\text{表})は、


P\langle X\rangle[Y](x | \text{表}) = \begin{cases}
\frac{2}{3} & (x = \text{赤}) \\
\frac{1}{3} & (x = \text{白}) \\
\end{cases}

コインが裏のときの Xの確率分布 P\langle X\rangle [Y](x|\text{裏})は、


P\langle X\rangle[Y](x | \text{裏}) = \begin{cases}
\frac{1}{3} & (x = \text{赤}) \\
\frac{2}{3} & (x = \text{白}) \\
\end{cases}

と考えるのが自然。

そして、コインが表になるか裏になるかの確率分布は P\langle Y\rangle(y) = \frac{1}{2}と考えるのが自然で、条件付き確率分布の定義から得られる積の法則を使うと、同時確率分布 P\langle X, Y\rangleは、


\begin{align}
P\langle X, Y\rangle(\text{赤}, \text{表}) &= P\langle X\rangle[Y] (\text{赤}| \text{表}) P\langle Y\rangle(\text{表})
 = \frac{2}{3} \cdot \frac{1}{2} = \frac{2}{6} \\
P\langle X, Y\rangle(\text{白}, \text{表}) &= P\langle X\rangle[Y] (\text{白}| \text{表}) P\langle Y\rangle(\text{表})
 = \frac{1}{3} \cdot \frac{1}{2} = \frac{1}{6} \\
P\langle X, Y\rangle(\text{赤}, \text{裏}) &= P\langle X\rangle[Y] (\text{赤}| \text{裏}) P\langle Y\rangle(\text{裏})
 = \frac{1}{3} \cdot \frac{1}{2} = \frac{1}{6} \\
P\langle X, Y\rangle(\text{白}, \text{裏}) &= P\langle X\rangle[Y] (\text{白}| \text{裏}) P\langle Y\rangle(\text{裏})
 = \frac{2}{3} \cdot \frac{1}{2} = \frac{2}{6} \\
\end{align}

となる。

なお、上記の同時確率分布 P\langle X, Y\rangleが与えられているときに、周辺確率分布 P\langle Y\rangleを計算して、そこからさらに条件付き確率分布 P\langle X\rangle [Y]を計算してすると、たしかに上記の通りになっていて、特に問題はない。

イカサマコインの場合

ただ、これがイカサマコインになると、途端に話が変になる。

さて、実はこのコインがどちらも「表」だったとする。 (※表も裏も同じ表面の絵柄になっている、ということ)

そうすると、 P\langle Y\rangle(\text{表}) = 1 P\langle Y\rangle(\text{裏}) = 0となる。

じゃあ、まずここで、確率変数 Yから「裏」を取り除いて \overline{Y} = \{表\}にすべきか、となる。

いや、コインを投げたときに「表か裏が出る」というのは確率分布を考える前からあるもので、ここではたまたまその確率分布で裏になる値が0だっただけであり、後から与えられた確率分布の実際の値からその前にすでに与えられている確率変数の要素を変えてしまうというのは、かなり変な感じがする。

加えていうと、ここで定義域から「裏」を取り除いてしまうと、途端に P\langle X\rangle [Y](x|\text{裏})は定義されないとなってしまう。 イカサマコインかどうかで袋から玉が取り出される確率分布が定義されるかどうかが変わってしまうというのは、かなりおかしい。

さらに、 P\langle Y\rangleの様子が変わったときに、 P\langle X\rangle [Y]の様子が変わるものか、という話がある。

たとえば、普通のコインであろうとイカサマコインであろうと、袋から玉をとる確率自体は変わらない。 なので、 P\langle Y\rangleの様子が変わったとしても、 P\langle X\rangle [Y]の様子は変わるはずがない。

けど、このときに同時確率分布を計算してみると、


\begin{align}
P\langle X, Y\rangle(\text{赤}, \text{表}) &= P\langle X\rangle[Y] (\text{赤}| \text{表}) P\langle Y\rangle(\text{表})
 = \frac{2}{3} \cdot 1 = \frac{2}{3} \\
P\langle X, Y\rangle(\text{白}, \text{表}) &= P\langle X\rangle[Y] (\text{白}| \text{表}) P\langle Y\rangle(\text{表})
 = \frac{1}{3} \cdot 1 = \frac{1}{3} \\
P\langle X, Y\rangle(\text{赤}, \text{裏}) &= P\langle X\rangle[Y] (\text{赤}| \text{裏}) P\langle Y\rangle(\text{裏})
 = \frac{1}{3} \cdot 0 = 0 \\
P\langle X, Y\rangle(\text{白}, \text{裏}) &= P\langle X\rangle[Y] (\text{白}| \text{裏}) P\langle Y\rangle(\text{裏})
 = \frac{2}{3} \cdot 0 = 0 \\
\end{align}

となる。

すると、 P\langle X\rangle[Y] (x| \text{裏})は分母が0になってしまうので、このままでは定義できないとなってしまう。

じゃあそこでちょっと前の議論に戻って、分母が0になる場合は条件付き確率分布 P\langle X\rangle[Y](x|y)を周辺確率分布 P\langle X\rangle(x)と定義したらどうか、というのを考えてみる。

この場合、


P\langle X\rangle[Y](x | \text{裏})
= P\langle X\rangle (x)
= \begin{cases}
\frac{2}{3} & (x = \text{赤}) \\
\frac{1}{3} & (x = \text{白}) \\
\end{cases}

となるけど、これは明らかにおかしい。 なぜって、イカサマコインを使ったら袋から出る玉の確率まで変わってしまうことになるから。

もちろん、 P\langle Y\rangle(\text{裏}) = 0なので、条件付き確率分布 P\langle X\rangle[Y](x | \text{裏})がおかしくなってしまっても、同時確率分布 P\langle X, Y\rangle(x, \text{裏})はおかしくならないんで、実害は出ないかもしれないのだけど。

以上の議論から、別の定義にするのもダメだし、定義域から削るのもダメだということが分かる。

そもそも何がおかしいのか

じゃあ、そもそも何がおかしいのか、というと、同時確率分布をまず考えて、そこから周辺確率分布、条件付き確率分布を定義しようとしていることなんだと自分は思っている。

上の議論を見て分かる通り、条件付き確率分布というのはパラメータを持った確率分布で、それは同時確率分布よりも前に存在している。 それを、同時分布よりもあとに定義しようとするから、おかしなことが起きてくる。

おそらく、条件付き確率分布をパラメータあり確率分布のように定義して、そこから積の法則を定義として同時確率分布を定義するのが正解なように思う。

今日はここまで!

ベイズ統計学を学んでみた。(その8)

前回は周辺確率分布を定義した。

今回は条件付き確率分布を定義する。

固定化と条件付き確率分布

確率変数 X, Y, Zの同時確率分布 P\langle X, Y, Z\rangle : X \times Y \times Z \rightarrow \mathbb{R}_{\ge 0}に対して、 Zをある値 zに固定したときの X Yの同時確率分布を条件付き確率分布と呼び、次のように定義する:


P\langle X, Y\rangle [Z](x, y | z) = \frac{ P\langle X, Y, Z\rangle (x, y, z) }{ P\langle Z\rangle (z) }

なお、 P\langle X, Y\rangle [Z] : X \times Y \times Z \rightarrow \mathbb{R}_{\ge 0}だが、ここでは P\langle Z\rangle (z) = 0となる zでは未定義としておく。 (この P\langle Z\rangle (z) = 0となる場合は非常に厄介で、詳細はまた別に議論したい)

命題

 P\langle 2^X, 2^Y\rangle [Z] (X, Y | z) = 1

証明


\begin{align}
P\langle 2^X, 2^Y\rangle [Z] (X, Y | z)
&= \underset{x \in X, y \in Y}{\int\!\int} \frac{ P\langle X, Y, Z\rangle (x, y, z) }{ P\langle Z\rangle (z) } \, dx \, dy \\
&= \frac{ 1 }{ P\langle Z\rangle (z) } \underset{x \in X, y \in Y}{\int\!\int} P\langle X, Y, Z\rangle (x, y, z) \, dx \, dy \\
&= \frac{ 1 }{ P\langle Z\rangle (z) } \cdot P\langle Z\rangle (z) \\
&= 1
\end{align}

よって示された。 \Box

この命題から、 P\langle X, Y \rangle [Z]はたしかに確率変数 X, Yに関する同時確率分布になっていることが分かる。 (=記法での不一致は起きていない、ということ)

周辺化と同じように、ここではこれを確率変数 Zを値 z固定化した呼ぶことにする。 (※これは独自の言葉で、一般に固定化という用語はない)

複数変数の固定化 vs 複数回の固定化

固定化に関しても周辺化と同じ議論ができ、次の命題が成り立つ:

命題

同時確率分布 P\langle X, Y, Z \rangleに対して、 Y, Zを固定化した確率分布 P_1\langle X \rangle [Y, Z] と、 Zを固定化した P\langle X, Y\rangle [Z] に対して Yを固定化した確率分布 P_2\langle X\rangle [Y, Z] は等しい。

証明は周辺化のときと同じように定義にしたがって計算するだけなので省略。

f:id:yamaimo0625:20210430165233p:plain


さて、分母が0になる場合について議論したいんだけど、長くなるので次回で。

今日はここまで!

ベイズ統計学を学んでみた。(その7)

前回は確率変数が複数ある場合の確率分布や確率を定義した。

そこから派生する議論を今回からはしていく。

周辺化と周辺確率分布

確率変数 X, Y, Zの同時確率分布 P\langle X, Y, Z\rangle : X \times Y \times Z \rightarrow \mathbb{R}_{\ge 0}に対して、 関数 P\langle X, Y\rangle : X \times Y \rightarrow \mathbb{R}_{\ge 0}を次のように定義する:


P\langle X, Y\rangle(x, y) 
= P\langle X, Y, 2^Z\rangle (x, y, Z)
= \int_{z \in Z} P\langle X, Y, Z\rangle (x, y, z) dz

つまり、 zに関して積分して元の関数(同時確率分布)から zを取り除いた関数。

命題
 P\langle 2^X, 2^Y\rangle (X, Y) = 1

証明


\begin{align}
P\langle 2^X, 2^Y\rangle(X, Y)
&= \underset{x \in X, y \in Y}{\int\!\int} P\langle X, Y \rangle (x, y) \, dx \, dy \\
&=  \underset{x \in X, y \in Y, z \in Z}{\int\!\int\!\int} P\langle X, Y, Z\rangle (x, y, z) \, dx \, dy \, dz \\
&= 1
\end{align}

よって示された。 \Box

この命題から、関数 P\langle X, Y \rangleは確率変数 X, Yに関する同時確率分布になっていることが分かる。 (=記法での不一致は起きていない、ということ)

このように、同時確率分布 P\langle X, Y, Z\rangleから同時確率分布 P\langle X, Y\rangleを得ることを、 Z周辺化するといい、 P\langle X, Y, Z\rangleに対して P\langle X, Y\rangle周辺確率分布と呼ぶ。

一つ注意したいのは、この周辺確率分布というのは相対的なものだということ。

たとえば、この P\langle X, Y\rangleに対して同様に Yを周辺化した確率分布 P\langle X\rangleを考えることができるけど、 P\langle X, Y, Z\rangleから見たとき P\langle X, Y\rangleは周辺確率分布になっているのに対し、 P\langle X\rangleから見たとき P\langle X, Y\rangleは周辺確率分布にはなっていない。

複数変数の周辺化 vs 複数回の周辺化

さて、同様にして、同時確率分布 P\langle X, Y, Z\rangleから Y Zを周辺化した周辺確率分布 P\langle X\rangleも定義できる:


P\langle X\rangle (x) = P\langle X, 2^Y, 2^Z\rangle (x, Y, Z) = \underset{y \in Y, z \in Z}{\int\!\int} P\langle X, Y, Z\rangle (x, y, z) \, dy \, dz

また、同時確率分布 P\langle X, Y, Z\rangleから Zを周辺化した周辺確率分布  P\langle X, Y\rangleは同時確率分布でもあるので、さらに Yを周辺化して周辺確率分布 P\langle X\rangleを得ることもできる。

となると、問題となるのは、この2つの確率分布 P\langle X\rangleが一致するのかどうか。

幸いにも、次の命題でこの2つは一致することが示される:

命題
同時確率分布 P\langle X, Y, Z\rangleに対して、 Y, Zを周辺化した確率分布 P_1\langle X\rangleと、 Zを周辺化した P\langle X, Y\rangleに対して Yを周辺化した確率分布 P_2\langle X\rangleは等しい。

証明
まず、

 P_1\langle X\rangle (x) = \underset{y \in Y, z \in Z}{\int\!\int} P\langle X, Y, Z\rangle (x, y, z)\, dy \, dz

そして、

 P_2\langle X\rangle (x) = \int_{y \in Y} P\langle X, Y \rangle (x, y) dy = \underset{y \in Y, z \in Z}{\int\!\int} P\langle X, Y, Z\rangle (x, y, z) \, dy \, dz

したがって、 P_1\langle X\rangle (x) = P_2\langle X\rangle (x) \Box

図示すると次のようになっている:

f:id:yamaimo0625:20210410215244p:plain

この命題が成り立つので、記法は周辺化のやり方に依存しなくていいとなる。 (本当は命題が成り立つ前はちゃんと記法を分けて議論した方がいいんだけど)

ところで、確率変数を2つでしか考えていないと、この問題は出てこない。 なので、上の命題をそもそも考えたことがない人が多いはず。 確率変数を3つにして考えることで、こういったことも気づける。

今日はここまで!