しえログ

qiita との使い分けに悩んでる

読んだ書籍とか買った書籍とか

先週末は久しぶりの3連休だった気がする。先輩たちとの飲みに髪切りにと色々できた休日だったけど、それでもやりたいことが多すぎて全然手がつけられていない。

とはいえ昨日にはなったけどもここ2ヶ月ほどちまちまと読み進めていた「プログラミングのための確率統計」の1部をようやっと読み終えた。早く2部に入りたくてウズウズしながら読み進めていたものの、シミュレーションコード書きながらだったためか、それなりに時間はかかってしまったし、結局理解の足りてないところはまだ結構ある気がしている。2部は実用的な話が続くということなので、読み進めつつ理解が定着してない箇所を炙り出せればいいなという楽観的な魂胆でいる。

書籍といえば

あたりをここ1ヶ月以内に購入していたけど、もちろんあんま読めてはいない。 夜はなんだかんだ独りでバー行っちゃうこともあるので、そこで読書できればいいんだろうけどつい酒とスマホに集中してしまうし酔ってる状態で難解な文章理解できる気もしない。

そういえば会社の方が寄稿していたデータサイエンス系のムック本がそろそろ出るらしい。 相変わらず積ん読ばかりだけど、今年は分野的にどんなワードを頻度高く目にするかを見極めるのも初学者として心得ているので、あまり気にせず色々買うことにしている。

データサイエンティスト養成読本 登竜門編 (Software Design plus)

データサイエンティスト養成読本 登竜門編 (Software Design plus)

くじのポートフォリオを Python でシミュレーション

書籍「プログラミングのための確率統計」のP.111の「コラム:ポートフォリオ」を Python でシミュレーションしてみたのでその結果。

くじの詳細と賭け方

確率 0.7 で A が出て、確率 0.3 で B が出るくじを想定する。A、B どちらに賭けても当たったら掛け金が 2 倍になって返ってくる。 もし指定の期間中、毎日全財産をこのくじの A に割合 p で、B に残りの割合で賭け続けるとした場合、 p はどんな値にしておくのが望ましいか。

シミュレーションコード

Python3 で記述。

第1コマンドライン引数で確率 p を、第2コマンドライン引数で期間日数を指定。試行回数はとりあえずで 100 回。元手は10000円とした。

財産が何倍になったかの試行結果を matplotlib でヒストグラムに表示し、さらに横軸のスケールは書籍に合わせて常用対数をとった。

金融とかそこらへんのワードわからないので変数名とかは色々妥当じゃないかも・・・。

ポートフォリオのシミューレション

結果

p = 0.7

$ python3 main.py 0.7 100
[  4.   4.   7.  18.   0.  30.  10.  18.   7.   2.]
[-1.  -0.2  0.6  1.4  2.2  3.   3.8  4.6  5.4  6.2  7. ]

f:id:cielan:20170320184745p:plain

p = 0.8

$ python3 main.py 0.8 100
[  2.   1.   9.  13.  21.  21.  25.   1.   6.   1.]
[ -6.   -4.4  -2.8  -1.2   0.4   2.    3.6   5.2   6.8   8.4  10. ]

f:id:cielan:20170320184830p:plain

p = 0.9

$ python3 main.py 0.9 100
[  3.   7.  12.  14.  14.  17.  15.  12.   5.   1.]
[-13.  -11.1  -9.2  -7.3  -5.4  -3.5  -1.6   0.3   2.2   4.1   6. ]

f:id:cielan:20170320184850p:plain

p = 0.99

$ python3 main.py 0.99 100
[  7.   8.  15.   6.  19.  19.   5.  15.   4.   2.]
[-47.  -43.6 -40.2 -36.8 -33.4 -30.  -26.6 -23.2 -19.8 -16.4 -13. ]

f:id:cielan:20170320184902p:plain

所感

儲かる方ばかりにウェイトを寄せずに適度に分散して投資しよう。

プログラミングのための確率統計

プログラミングのための確率統計

大規模画像データセット オレオレまとめ

公開されている静止画像データセットなるものをちょっと調べたのでメモ。 今のところはこんなのがあるよ的な自分用メモ程度にまとめておくけど、このままだと全然使えるはず無いので後から徐々に編集・追記はしていくつもり・・・。

お酒の量は程々に

土曜日は前のチームの先輩のお家に皆でお邪魔して飲み会。 所属は皆見事に散り散りになったけど、こういう繋がりを持てるチームであったことには素直に感謝したい。 色々あって昨年末に自分から抜けるという選択をとったけど、メンバーには恵まれたチームだったとホントに思う。 帰宅が朝3時半ぐらいだった気がするけど、疲労感をあまり感じなかったのも良い会合だったからなんだろうな。

そういえば結構な量の酒を飲んだ割には記憶も飛んでないし2日酔いにもならなかった。 日によって体調も変わるわけだしそりゃまぁ酔い過ぎる日もあれば全然酔わない日もあるよね、って話ではあるんだろうけど酒飲み続けて10年経った今でもその分水嶺がわからない。 飲んだ量とその後の体調を細かくメモする習慣があれば最高のデータ分析テーマとなるんだろうけど、ザンネンながら飲み過ぎた日のデータ欠損が容易に想像できるので実行しても意味があまりなさそうな気がする。 でもまぁそう思っておくだけである程度は2日酔いを防げるかもしれないし、3日坊主にならない程度に飲んだ酒をツイートしておくのも悪くないかもと思っている。 とりあえず今まさに飲んでる日本酒はノーカンである。

今期のアニメも終盤に差し掛かっているのがチラホラ見受けられるようになった。いつもこの時期は終わるアニメを想うととても物悲しくなるのだけれど、とりあえずオルフェンズの最後が気になりすぎるのではよ最終週来いと思うし、4月も面白そうなのが結構あるので楽しみにしている。

グラフカット以前のエネルギー最小化

今更ながらグラフカットについて学ぼうとしている。まずは基礎からということで、コンピュータビジョン最先端ガイドの2章を読み進めることに。
学んだことについてメモを記していくけど、まずはエネルギー最小化について。

2値画像のノイズ除去

エネルギー最小化によって2値画像のノイズを除去する場合、まず場所を表すサイトの集合 { V } を定義する。画像 { Y } が与えられたとして、その画素の1つ1つがサイトと考えられる。

{ V=\{\left(i,j\right) \mid i=1,\dots,n; j=1,\dots,m\} }

2値画像なので各画素の取りうる値(ラベル)は以下のようになる。

{ L=\{0,1\} }

ノイズを除去した2値画像は各画素に0か1を割り振りなおす形で得られる。各サイトにラベルを割り振ることを配置といい、 { V } から { L } への写像と言える。これを{ (V,L) } の配置と呼ぶ。配置 { X } といったとき、 { X } はサイト { u \in V } にラベル { X_u \in L } を割り振るものとする。
ノイズ画像において隣接画素間の変化が少なくなるような { X } を探して、それを除去画像とするわけだけど、やりすぎると完全に一色の画像となってしまう。これらのトレードオフをエネルギーという関数で定義することでエネルギー最小化の問題を解くことができる。
以下の式における { X } を動かして { E(X) } が最小となる { X } を見つける。

{ E(X) = \displaystyle \sum_{v \in V} \lambda | Y_v - X_v | + \displaystyle \sum_{(u,v) \in E} \frac{\kappa}{2} | X_u - X_v | }

  • { u, v }: { V } の元
  • { E }: { (u, v) } 全体からなる集合 ( { E \subset V \times V } )
  • { \lambda, \kappa }: 正の定数
  • { Y }: ノイズ入り画像を表す配置

一般の場合

↑の式を少し抽象的にすると以下の式の形になる。

{ E(X) = \displaystyle \sum_{v \in V} g_v(X_v) + \displaystyle \sum_{(u,v) \in E} h_{uv}(X_u, X_v) }

  • { V }: 画素など「場所」を表すサイトの集合
  • { E \subset V \times V }: サイト間の隣接関係を表す集合
    • { (u, v) \in E } のときサイト { u }{ v } は隣接している
    • { (u,v) \in E \Leftrightarrow (v, u) \in E }

解くべき問題は { V } の各サイトにラベルを割り振ること。ラベルの有限集合を { L } として、 { (V, L) } を配置と呼ぶ。
{ (V, L) } の配置 { X } とは、 { V } の各サイト { v } にラベル { X_v \in L } を与える写像

{ 
\begin{eqnarray}
X \colon V &\mapsto& L\\
v &\mapsto& X_v
\end{eqnarray}
 }

{ V } を画素の全体、 { L } として全体の色を取れば、 { n \times m } 画素の RGB ビットマップ画像は、各画素に色をひとつずつ与える配置 { X } と考えることが出来る。

{ L = \{\left(r,g,b\right) \mid r =0,\dots,255; g=0,\dots,255; b = 0, \dots, 255 \} }

{
\begin{eqnarray}
X \colon V &\mapsto& L\\
(i,j) &\mapsto& X_{(i,j)} = (r_{i,j}, g_{i,j}, b_{i,j})
\end{eqnarray}
}

このような { X } にエネルギー { E(X) } を与えるのが↑の式になる。
2値画像での例を持ち出すと、

{ g_v(X_v) = \lambda | Y_v - X_v | }

{ \displaystyle h_{uv}(X_u, X_v) = \frac{\kappa}{2} | X_u - X_v | }

になる。 { g_v(X_v) } はサイトとそのサイトに付与されたラベルのみによる値なのでデータ項、 { h_{uv}(X_u, X_v) } は隣接するサイト間で { X } に与えられるラベルがどのような関係にあるべきかを示す(普通は隣接ラベル間の変換を平滑化する)ため平滑化項と呼ばれる。

{ E(X) } のようなエネルギー式はマルコフ確率場( MRF )の最大事後確率( MAP )推定のときによく使われる。

{ \displaystyle P(X | D) = \frac{P(D | X)P(X)}{P(D)} }

において、データ { D } が与えられたとき、 { D } は固定済みなので { P(D) } は定数となり、 { P(D | X)P(X) } を最大化することで { P(X | D) } が最大となり、MAP 推定としては最大化する { X } を求めれば良いことになる。このとき、 { D } の尤度 { P(D | X) } がデータ項に、 { P(X) } が平滑化項に、それぞれ対数値の -1 倍となって表現される。

所感

メモとしては一般の方だけで良かったな・・・。せっかく書いたし両方乗っける。
次はグラフカットの本流についても勉強してコードまで落としこめてまたエントリ書きたい。

コンピュータビジョン最先端ガイド1[CVIMチュートリアルシリーズ]

コンピュータビジョン最先端ガイド1[CVIMチュートリアルシリーズ]

  • 作者: 倉爪亮,石川博,加藤丈和,佐藤淳,三田雄志,八木康史,斎藤英雄
  • 出版社/メーカー: アドコム・メディア
  • 発売日: 2008/12/03
  • メディア: 単行本
  • 購入: 9人 クリック: 71回
  • この商品を含むブログ (11件) を見る

最近の個人メモツール環境

SAO の映画が評判高いみたいですね。見たいのだけれど、2期をまるまる見逃していたことに気づいて昔の録画で追っかけてます。まだ3話目で全話見終える頃に上映続いているのかちと心配になってきてる。キリトくんは全然変わらないなーって思うんだけど、アスナさんの髪がオレンジから青になってて分かりづらいというか、もうそれほぼ補色じゃんって感じですよね。所属する種族がウンディーネだから仕方ないんだろうけど。

最近 kibela が正式リリースされたってんで、触ってみたというかアカウント作ってちまちま使ってみました。当たり前なんだけどチーム開発向けのウェブサービスなので、1人で使っててもオンライン同期できるメモツールとそんな変わらないっすな・・・。ただ、機能自体も esa.io とか qiita team などとの差別化要素があまり見当たらない気がする・・・。立ち上げたばかりのベンチャーとかだとフリープランで行けそうだし料金面ではオトクなのかな。

自分個人で使ってるオンライン同期系メモツールといえば、ここ1年ほどは PileMd ってのを利用している。とにかくシンプルなのと同期システムは自前で準備していいのが分かりやすい。クライアントも Win/Mac/Linux 揃ってるし。欲を言えば数式が書けるようになってほしかったりする。似たようなので Boostnote ってのも出てきてて、こっちは数式は書けるんだけど編集モードと閲覧モードの切り替えがホットキーで出来ない気がする( PileMd は Alt + P で出来る)ため今のところ利用を見送っている。

偉そうに書いたけど、せっかくどっちもオープンソースなんだし要望ばっか言ってないで自分でプルリクするなりしろっつー話ではあるのでここまでにしておく。いつも素敵なプロダクトをありがとうございます。

識別モデルの評価指標

久々に初学者丸出しの記事を書く。

論文で検出器について書いた際に、ちゃんと識別モデルの評価指標とそれが実際どのぐらいであったかは記述しようぜ、とのコメントを頂いたので今更ながら勉強してみた。 書き上げる前にやっとけよ、っつー話すぎるけど、せっかくなので簡潔だけどまとめておく。

評価指標

正解データ、不正解データ、そして識別結果データのセットが与えられた時に、下記を計算することができる。 ちなみに以下の表は混同行列( Confusion Matrix )というらしい。

識別結果・陽性 識別結果・陰性
正解 TP => 真陽性 FN => 偽陰性
不正解 FP => 偽陽性 TN => 真陰性

以上を用いてまとめると主な評価指標は以下の通りとなる。

  • 正解率(Accuracy)
    • {\frac{TP+TN}{TP+FN+FP+TN}}
  • 再現率(Recall)
    • {\frac{TP}{TP+FN}}
  • 適合率(Precision)
    • {\frac{TP}{TP+FP}}
  • F値
    • {\frac{2 * Recall * Precision}{Recall + Precision}}

それぞれどんな場合に指標としていいかはちゃんと判断して利用するべき。

ROC 曲線

Receiver Operating Characteristic curve の略。 真陽性率(TP)と偽陽性率(FP)の関係を示す、識別モデルがどの程度の性能を持つのかを表す曲線のこと。 こんな図になる。

f:id:cielan:20170228014254p:plain

  • AUC( Area Under the Curve )
    • ROC 曲線の下の面積値。大きければ性能が良い。
  • 左上から曲線までの距離
    • そのまま。短ければ性能が良い。

複数の分類結果があるときにこの曲線にまつわる指標を比べたりする。