機械学習 now

『ネットがつながらなかったので仕方なく本を1000冊読んで考えた』そしたら意外に役立った という、キャッチャーな本が有ったので、意外に役立つか、読んでみた。

一発で著者が分かる方は、読書通な方だと思うぞ。そういう方は、ここを読み飛ばしてください。

こたえは、刑務所 now を書いた方。これだけヒントを言えば、日本人の80%は、正解を言い当て られましたって、某番組みたいなあおりで、正解に辿りつけるでしょう。

でも、2年半の刑期中に、1000冊も読めるのか? 彼によると(これで、正解にたどり着く確率が上昇しましたよ)、読みたい本を面会に来た友人らに託すのだそうです。そして、本が差し入れされても、検閲と言うフィルターが待っています。

このフィルターのアルゴリズムが全く分からなかったそうです。いずれにしろ、このフィルターは、実行スピードも遅いし、彼専用のパイプラインになってるはずはなく、待ち行列に 並ばされる事でしょう。

何人ぐらい検閲官がいるのかな? 検閲官は、差し入れの本だけじゃなくて、郵便物も担当する そうです。受刑者は勤務態度によって、出せる郵便物の数が決まっているとか。一般受刑者は、4件/月、模範犯はそれが引き上げられるそう。

彼は、長野刑務所に勤務(収監)されてたそうだけど、何人ぐらい収容してるんだろう? 仮に1000人としても、郵便物だけで、4000通。中から外へ出てく物だけじゃなくて、外から 中へのパケットも検査される。こちらの方は、制限が無いから、どれぐらい来るかは分からない けど、膨大な数になるはず。

そして、こういう通信文は、疑似でもリアルタイム性を求められるはずだから(官にそういう サービス精神が有るかどうか?)、そちらが優先されるはず。そうなると、いきおい、差し入れ 本の検閲路は、nice値が下がる(こういう表現で良かったっけ)はずなんで、2年半で1000冊と 言うのは、キャッチャーだと思われる。

まあ、彼の罪状も似たようなだましの手口が、国家によって認定されたからだけど。

で、おまけで、娑婆に出て来てから、読みたい本をどうやって選ぶと某者と対談してる。 日本では、月に3000冊余りの書籍が出版されるとか。そこから、どうやって(金になりそうな 話題本を)選ぶってのが重大事になる。

そんなの、人に頼んで、良書を推薦して貰えばいいじゃん。ここにもフィルターが出てきたな。 お勧めは、 WEB本の雑誌 とか。週アスの書評欄は、彼が誉めてた。

アマゾンの書評は、食べログと一緒で、あてにならないとか。でも、一応、トレンドを追って いると思われるので、挙げておく。

コンピュータ・IT の 新着ランキング

オイラーがこれを見て反応するか? そういう事は99%無くなってしまっていますよ。

機械学習 準備

今年のトレンドは、機械学習らしい。Googleの碁で、まざまざと実力を魅せられると、ITに 関わった人なら食指が動かないはずはない。そして良いタイミングで、TensorFlowなんて のがgoogleから提供されたんで、猫も杓子もって訳。

3ステップディープラーニング with TensorFlowなんか、良記事だと思うぞ。

そして、アカデミアでも大事だよーって事で、 人工知能の学習理論 取り上げられたりしてる。

ならば、オイラーも腰を上げてみるか。ググル流にやろうとすると、普通のCPUですか、 GPUですかって、聞かれるらしい。これって、貧民ですか? 富民ですかって暗に聞かれてる みたいで、気分が悪い。(←ひがみ根性丸出し)せっかく、この間パソコンを新調したというのにね。だから、Pythonは棄て捨てさ。

そんな折、

クジラ飛行机「仕事に役立つJavaScript入門」

こんなのが目に付いた。簡単そうだからやってみるか。

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とかで、簡単に解決するの?