機械学習 now
『ネットがつながらなかったので仕方なく本を1000冊読んで考えた』そしたら意外に役立った という、キャッチャーな本が有ったので、意外に役立つか、読んでみた。
一発で著者が分かる方は、読書通な方だと思うぞ。そういう方は、ここを読み飛ばしてください。
こたえは、刑務所 now を書いた方。これだけヒントを言えば、日本人の80%は、正解を言い当て られましたって、某番組みたいなあおりで、正解に辿りつけるでしょう。
でも、2年半の刑期中に、1000冊も読めるのか? 彼によると(これで、正解にたどり着く確率が上昇しましたよ)、読みたい本を面会に来た友人らに託すのだそうです。そして、本が差し入れされても、検閲と言うフィルターが待っています。
このフィルターのアルゴリズムが全く分からなかったそうです。いずれにしろ、このフィルターは、実行スピードも遅いし、彼専用のパイプラインになってるはずはなく、待ち行列に 並ばされる事でしょう。
何人ぐらい検閲官がいるのかな? 検閲官は、差し入れの本だけじゃなくて、郵便物も担当する そうです。受刑者は勤務態度によって、出せる郵便物の数が決まっているとか。一般受刑者は、4件/月、模範犯はそれが引き上げられるそう。
彼は、長野刑務所に勤務(収監)されてたそうだけど、何人ぐらい収容してるんだろう? 仮に1000人としても、郵便物だけで、4000通。中から外へ出てく物だけじゃなくて、外から 中へのパケットも検査される。こちらの方は、制限が無いから、どれぐらい来るかは分からない けど、膨大な数になるはず。
そして、こういう通信文は、疑似でもリアルタイム性を求められるはずだから(官にそういう サービス精神が有るかどうか?)、そちらが優先されるはず。そうなると、いきおい、差し入れ 本の検閲路は、nice値が下がる(こういう表現で良かったっけ)はずなんで、2年半で1000冊と 言うのは、キャッチャーだと思われる。
まあ、彼の罪状も似たようなだましの手口が、国家によって認定されたからだけど。
で、おまけで、娑婆に出て来てから、読みたい本をどうやって選ぶと某者と対談してる。 日本では、月に3000冊余りの書籍が出版されるとか。そこから、どうやって(金になりそうな 話題本を)選ぶってのが重大事になる。
そんなの、人に頼んで、良書を推薦して貰えばいいじゃん。ここにもフィルターが出てきたな。 お勧めは、 WEB本の雑誌 とか。週アスの書評欄は、彼が誉めてた。
アマゾンの書評は、食べログと一緒で、あてにならないとか。でも、一応、トレンドを追って いると思われるので、挙げておく。
オイラーがこれを見て反応するか? そういう事は99%無くなってしまっていますよ。
機械学習 準備
今年のトレンドは、機械学習らしい。Googleの碁で、まざまざと実力を魅せられると、ITに 関わった人なら食指が動かないはずはない。そして良いタイミングで、TensorFlowなんて のがgoogleから提供されたんで、猫も杓子もって訳。
3ステップディープラーニング with TensorFlowなんか、良記事だと思うぞ。
そして、アカデミアでも大事だよーって事で、 人工知能の学習理論 取り上げられたりしてる。
ならば、オイラーも腰を上げてみるか。ググル流にやろうとすると、普通のCPUですか、 GPUですかって、聞かれるらしい。これって、貧民ですか? 富民ですかって暗に聞かれてる みたいで、気分が悪い。(←ひがみ根性丸出し)せっかく、この間パソコンを新調したというのにね。だから、Pythonは棄て捨てさ。
そんな折、
こんなのが目に付いた。簡単そうだからやってみるか。
JavaScriptの深層学習ライブラリを使って「肥満判定プログラム」を作ってみようからだな。
nodeとかが必要らしい。OpenBSDに有るかと思ったら、パッケージになってた。ラッキー。
次は、学習器か、npm install synaptic --save とかするんだな。そして、記事を写経じゃ なくて、コピペして走らせる。
[ob: js]$ node make-data.js /home/sakae/js/make-data.js:6 let height = rand(120, 200); ^^^ SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode at exports.runInThisContext (vm.js:53:16) at Module._compile (module.js:373:25) at Object.Module._extensions..js (module.js:416:10) at Module.load (module.js:343:32) at Function.Module._load (module.js:300:12) at Function.Module.runMain (module.js:441:10) at startup (node.js:139:18) at node.js:968:3 [ob: js]$ node -v v4.4.5
いきなりエラーの洗礼かよ。nodeのバージョンが古いのかなあ? 調べてみると、"use strict" とか言うperlに有った みたいなのを突っ込んでおくと回避出来るみたい。で、やってみると
[ob: js]$ node make-data.js /home/sakae/js/make-data.js:17 data_json = JSON.stringify(data); ^ ReferenceError: data_json is not defined at Object.<anonymous> (/home/sakae/js/make-data.js:17:11) at Module._compile (module.js:409:26) at Object.Module._extensions..js (module.js:416:10) at Module.load (module.js:343:32) at Function.Module._load (module.js:300:12) at Function.Module.runMain (module.js:441:10) at startup (node.js:139:18) at node.js:968:3
今度は、こんなエラーが。もう諦めよう。どうもnodeに限らずWeb系は足が速い生鮮食品なので、半年も 前のパッケージじゃだめなのかな。 今年のうちに対応したい、Node.jsのBufferに潜む危険性 こういう怖い事も有るようだし。 ってんで、Debianにスイッチする。
案内にある日本のnode(ISPの人なら、そりゃ大手町の某に有ると言う、臍を思い出すに違いない)から、64Bit用のtar玉を落としてきた。
展開してみると、好きな所に置いてPATHを通しておけって雰囲気。/usr/bin/nodeに置いて、 PATH=/usr/local/node/bin:$PATH しておいた。
sakae@debian:~$ node -v v6.9.2
落としてきたnodeは、LTSなバージョンらしいです。HTML5と連携してるはずだから、今後 HTML6が出るまでは、サポートされるのかな。
使うパッケージである、synaticも無事に入った。(ワーニングが出てたけど、作法に従って 必要事項が登録されていない風に思えたので無視)
デブか普通の人か?
例題通りにやってみる。ああ、その前に一言。この間健康診断があって、当然のようにメタボ 認定のための一要件である、腹回りを測られた。
看護師によると、臍の所で測るように指導されてるとか。そのおばさんも言ってたけど、 臍の所って意外に太っていないのよね、との事。そう、臍よりやや下の方が太いぞ。
検診の医師に、腹回り測って、病気との相関って取れるの? 余計なお世話じゃない。 統計的に相関データって何か有るのって、聞いてみた。
臓器に付く脂肪を推測する目安になるとか。だったら、オムロンかどこかの体脂肪測れる やつの方が効果的じゃん。本当はCTを取らないと、臓器の脂肪なんて分からないそうな。 おーい、霜降り牛を育てている酪農家の人達が良い知恵をもってるかも。聞いてみて。
例題のBMI。これも外国仕様の指標だ。気にするな。
まずは、走らせてみるか。
sakae@debian:~/js/bmi$ node make-data.js ok, saved
sakae@debian:~/js/bmi$ head bmi.json [{"input":[167,55],"output":[1,0]},{"input":[200,39],"output":[1,0]}, .... {"input":[124,94],"output":[0,1]}
出来上がったbmi.jsonは、改行も無い、一本糞なやつだったぞ。これが、node業界のS式に 相当するものか。
適当に乱数を使って、身長と体重を生成。それを外国仕込みのBMI計算器にかけて指標化。 その数値が25より大きければ、デブ(差別用語と言われそう)の烙印を押す。 上の例だと、一応普通人。
そりゃ嘘だろ。身長2mで体重39kgって、ツィギィーも真っ青の枝みたいな人だ。そちらの 方が異常と思われ。
3例目は、124cmで体重94kgと言うタンクと言うかドラム缶みたいな人。文句なくデブ認定。
こんなどうしようも無い症例を集めて、集計にかかる。そして、十分にデータが集まった所で、 どんな人がデブ認定されたか学習する訳だ。 そして学習結果に基づいて、デブか普通か分からん、身長と体重を与えて、判定してもらう。
sakae@debian:~/js/bmi$ node lean-data.js iterations 1 error 0.4996739086957349 rate 0.2 iterations 2 error 0.27442420393075057 rate 0.2 iterations 3 error 0.2188821066446145 rate 0.2 : iterations 29 error 0.10657007921597142 rate 0.2 iterations 30 error 0.1091924004432035 rate 0.2 + 身長: 150 体重: 80 | - 判定: 肥満 | - 普通の可能性: 3.153873205228639e-8 | - 肥満の可能性: 0.9999999684477697 + 身長: 190 体重: 50 | - 判定: 普通 | - 普通の可能性: 0.9999999997860731 | - 肥満の可能性: 2.143572979767672e-10
30回データを読み直して、あーでもないこーでもないと、デブ/普通人の見分け方を 練習するんだな。練習する度に、判定精度が上がっていく。
で、自信が付いた所で、150cm/80kgの人は、デブでっしゃろか聞いてみた。 そしたら、絶対の自信を持って、デブと答えてきた。見抜かれたとでも言うんでしょうな。
190cm/50kgの人は、偉大なノッポさんだけど、ノッポを見分けるすべを練習してないんで、 普通人ですと答えたとな。
これって、練習で、コンピュータが、BMIの計算方法を推測したの? そして、その判定 リミットが25である事を見抜いたの?
いじわるしちゃうぞ
ランダムな身長と体重からデブ/普通人の判定データを作っている。こういうのを教師データと いうらしい。判定部分を抜き出すと
// BMIを計算して肥満かどうかを判定する function calc_bmi(height, weight) { let m = height / 100; let v = weight / (m * m); return (v > 25); }
だったら、BMIがぎりぎり25の人造人間を作り、それを正しく見抜けるかやってみる。
sakae@debian:~/js/bmi$ scheme -q (* 1.2 1.2 25) 36.0 (* 1.8 1.8 25) 81.0
身長120cmの人が普通人と判定される体重リミットは36kgです。もう一人は、180cmのノッポさん。(微妙にノッポさんなのは、オイラーの憧れが反映してる、かも)
これを、プログラムに埋め込んで判定してみる。
+ 身長: 120 体重: 36 | - 判定: 普通 | - 普通の可能性: 0.895764950504528 | - 肥満の可能性: 0.10424224159320607 + 身長: 180 体重: 81 | - 判定: 肥満 | - 普通の可能性: 0.1710552896309938 | - 肥満の可能性: 0.8289522210336644
ノッポさんは判定を誤っています。いずれにしろ、こういう微妙な場合は、自信の度合いが ぐらついていますなあ。
今度は、教師データを作り直してみますかね。見る集団が変われば、違った目で見るように なるかも。
+ 身長: 120 体重: 36 | - 判定: 肥満 | - 普通の可能性: 0.06686798026440827 | - 肥満の可能性: 0.933055939824448 + 身長: 180 体重: 81 | - 判定: 普通 | - 普通の可能性: 0.793324040540681 | - 肥満の可能性: 0.20666590572645183
今度は、判定結果が逆になりましたねぇ。おまけに自信度も変わっています。 なんか、人間みたいにファジィーで面白いな。
この判定をするのに、50000人をじっと眺め、目が肥えた状態でやっている。 女房の大好物、お宝鑑定団で、100万円と古物商に言われて、納得して買った絵画が、哀れ 1000円と鑑定されたりする。ちゃんと本物をたくさん見ていれば、騙される事はないのにと。
50000人じゃなくて、500人ぐらいの人しか見てない場合は、騙されるのか?誤判定しちゃうのか? 試してみる。
+ 身長: 120 体重: 36 | - 判定: 肥満 | - 普通の可能性: 0.3291851166769505 | - 肥満の可能性: 0.6698724420960518 + 身長: 180 体重: 81 | - 判定: 肥満 | - 普通の可能性: 0.2115940377716219 | - 肥満の可能性: 0.788608337055336
おっ、騙されているじゃん。そんじゃ、別の500人の集団で、もう一度
+ 身長: 120 体重: 36 | - 判定: 普通 | - 普通の可能性: 0.9358051302880803 | - 肥満の可能性: 0.0641652703879608 + 身長: 180 体重: 81 | - 判定: 普通 | - 普通の可能性: 0.850204342713123 | - 肥満の可能性: 0.15096943654278686
今度は正しい判定をしたな。判定は、一瞬のうちに終わってしまって、直観に頼っている みたいに思えるぞ。
オイラーが、このような判定者を作るとしたら、そうね、横軸に1cmきざみで身長を、縦軸は、 1kgきざみで体重をとった枡を作り、その中に、デブ/普通人で色分けしたおはじきでも入れて いく。
判定される人も、その属性で決まった枡に行かせ、その枡の中に既にいるデブ/普通人の 割合で、判定される人の結果を決める。これなら、簡単そう。
でも、その方法ってもろに、モンテカルロ法じゃん。そんなのでいいのか? ちょっとぬけがけして、 機械にワインの味は判定できるか? その1なんかを見ると、一つのワインの 評価項目として13種ものパラメータが有る。
宇宙の状態を記述するには9次元が必要だ、いや10次元必要だとか騒がれているけど、そんな 深遠な話はおろか、地上にあるワインでさえ、13次元ものパラメータが必要。頭の中で、上記の モンテカルロ法を適用すれば、ほとんどのセルはスカスカ状態になろう事は想像するまでもない。
よって、この方法では、さっぱり的中精度が上がらない事は火をみるよりも明らかである。 どうやって、いるのだろう。
大体、架空データを作って、それを判定してみるって、現実味が無いな。実データを使って 判定するってのがリアルで宜しい。その例としてワインの味の判定が有るんだけど、他に どんなデータが公開されるのだろう?
データ 学習とかで検索すると、色々出てくるのかな?
競馬予想のための、データが有れば、機械学習させて、万馬券を当てられる? 今年の有馬には、もう間に合わないかも知れないけど、来年のための予行演習をしたいな。
あるいは、株の予想とかもいいかも。まてまて、そんな浮ついた気持ちではいかんぜよ。 足を地に付けるんだ。
node debug
nodeとかいう、Javascriptは初体験だったりします。まあ、Web方面を見据えた言語ってのは 間違いないんだけど、デバッグをどうするってのを、調べておきたい。
はじめてのNode.js:Node.jsアプリケーションのデバッグ
node-inspectorなしでNode.jsをデバッグする
さすが、人の集まる所は、充実してるな。
ぐぐる製のブラウザー chrome を要求されたんで入れようとしたけど、aptパッケージには なっていない。 そんじゃってわけで、本家から取ってきて、dpkg -i を使って入れようと したけど、あれこれ無いとぬかす。
で、あれを入れようとしたら、それが無いとぬかす。依存地獄が見え見えなので 諦めた。どうせ、オイラーはCUIな人さ。
まて、Windows7機にchromeが入っているぞ。そこでやってみれ。
node --inspect --debug-brk app.js
ながったらしいコマンドスイッチを含めて、aliasにndbとかで登録しときたいんだけど、 どうやるのが正解? 食わず嫌いだったPowerShellとかで、簡単に解決するの?