読者です 読者をやめる 読者になる 読者になる

頻度主義者を超えていけ

ベイジアンに変身するために、先日とあるセミナーに参加してきた

1.事前準備

1.1 環境構築@Windows10

・Rstudioをアップデート

公式サイトから最新バージョンをインストールすればよいだけ
https://www.rstudio.com/products/rstudio/download/
Installersの中から RStudio 1.0.136 - Windows Vista/7/8/10 を選択した
あとインストーラー様の言われるままに進んでいって、特に詰まるところもなかった

・Rをアップデート

RStudio上でコマンドを入力してアップデートしようした。
まずパッケージを準備

install.packages("installr")
library(installr)

その後、RStudioでアップデート用のコマンドを実行した。

updateR()

いろいろオプションの質問に答えるんだが、いざインストールしようとすると
「updateR()を使うなら、RStudio よりも Rgui.exe から実効するのがベストだ」
というアドバイスが表示された。

ので素直に Rgui.exe 上から再度 updateR() を実行した。
オプションの質問に答えていけば特に困ることなく終了。

Rstudioを再起動して、R version 3.3.2 と表示されることを確認。

・Rtoolsのインスコ

この項目であなたが見るべき情報はこのページだ。あとの部分は私の作業記録なので見なくてもよい
https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started-%28Japanese%29

まず、ここからRのバージョンに対応したファイルをダウンロードして実行
置く場所は特に理由がなければcの直下にしとけばよさげ
https://cran.r-project.org/bin/windows/Rtools/
途中で Edit the system PATH にチェックを入れる事を忘れずに

環境変数PATHの確認

> Sys.getenv('PATH')
[1] "c:\\\\Rtools\\\\bin;c:\\\\Rtools\\\\gcc-4.6.3\\\\bin;...


Rから本当にg++を呼び出せるかチェック

> system('g++ -v')
Using built-in specs.
COLLECT_GCC=c:\Rtools\GCC-46~1.3\bin\G__~1.EXE(以下略)
> system('where make')
c:\Rtools\bin\make.exe


rstanのインストール(結構時間かかった)

install.packages('rstan', repos='https://cloud.r-project.org/', dependencies=TRUE)


【※重要】Rの再起動

RでC++が動くが確かめる

fx <- inline::cxxfunction( signature(x = "integer", y = "numeric" ) , '
return ScalarReal( INTEGER(x)[0] * REAL(y)[0] ) ;
')
fx( 2L, 5 ) 

1.2 stanの雰囲気をさらっと味わっておく

(1) まず「MCMC(*´Д`)ハァハァ」でググる
(2) 検索結果の4番目ぐらいに出てくるコレを読む
http://www.slideshare.net/simizu706/stanr13
(3) (2)で紹介されれているRstan超初心者講習を読む
http://www.slideshare.net/simizu706/stan-62042940

1.3 ベイズ統計の入門書をざっと読んでおく

・図解・ベイズ統計「超」入門 あいまいなデータから未来を予測する技術 (サイエンス・アイ新書)
・完全独習 ベイズ統計学入門

2.セミナー本番

Rの使い方の基礎からベイジアンモデリングの実装まで全力で駆け抜けた。
合宿形式で、会場の露天風呂にも入ってゆっくりできた。
食事も美味しかった。

3.セミナーを終えて:ベイジアンへ変身できたのか

事前準備:刀を手に入れた
セミナー:刀の振り方を教わった
今後の目標:卍解できるようになりたい

超絶怒涛のセクシー勉強会

一応技術職についているので、日々の勉強は欠かせない。

新しい技術を勉強するのもさることながら、
以前勉強したことを頭のなかに維持することも大切。

使わないとどんどん忘れるから。


そんなわけで今年から、
毎日必ず1時間だけ時間を取って、ひとり勉強会をしている。

「超絶怒涛のセクシー勉強会」
自分で勝手にそう呼んでいる*1



場所は会社の会議室。

昼間はどの部屋も予定でびっしり埋まっているけれど、
夜8時頃をすぎれば使っているヒトなんてほとんどいない。

毎日空いてる部屋を見つけては、そこで勉強している。



勉強中にヒトの話し声が聞こえたり、話かけられたりするのはイヤなので、
自席ではやらない。

私は職場で話しかけられたら(よっぽど切羽詰ってない限り)相手の用事にその場で対応して決着をつけて終わらせると決めてる。

なので、話しかけられない場所に移動するのは、勉強の中断を防ぐという意味で結構大事だったりする。

集中するにはやはり個室に閉じこもる方が良い。




とりあえず第一期としては、分野ごとにテキストを1冊決めて、一気に読み通すことにしている。

分野は様々。

統計、線形代数微積機械学習、データサイエンス、webプログラミング・・・

この辺の分野ごとに1冊入門書を買って、ガーッと読んでいく*2





会社で使ってる自分用の予定表にもこの勉強会の時間を入れてるが、
この予定表は同僚も見れるので、勉強会のタイトルは恥ずかしくて書いてない。



「予定あり」


ふっふっふ。あるんですよ、「予定」が。

*1:「ひとりモクモク会」みたいな普通の名前では面白くない

*2:でも実際に買ったのはだいぶ前で積読状態だっただけ

基本の大切さ

初心者が基本的な知識を体系的に得る手段として、資格試験の勉強は極めて有効だ。

資格試験の出題範囲は「最低限知っておくべき知識」を網羅している。

なので試験対策をする過程で基本的な知識を網羅的に得ることができる。



勉強をとおして「体系的に」知識を積み重ねていけるかは、「良い本」を見つけられるかにかかっている。

単に試験に合格することだけに特化した対策本ではダメだ。

理解することに重きをおいて、
その上で試験に合格するためのポイント(試験で問われる点≒理解する上で重要な点)を押さえたタイプの本が良い。



In other words,

「『Aと来たらB』と覚えておけば大丈夫」みたいな説明の本ではダメだ。

この説明では試験に受かっても、あとに残るのは穴だらけでいびつな知識だけだ。


「Aとはこういうものだから、Bとこのような関係にある」という説明がある本が良い。

この説明であればたとえ試験を受けなくとも、たとえ試験に落ちようとも、後には意味を理解した自分が残る。



あくまでも我々の目的は知識を得て理解することだ。

試験を受けるかどうか、受けたときに合格するかどうかは、いずれも大した問題ではない。




例を挙げよう。


Linuxってなに?というとき

1週間でLPICの基礎が学べる本 第2版 徹底攻略シリーズ*1


ITとかシステムエンジニアの基本って何?というとき

キタミ式イラストIT塾 基本情報技術者

キタミ式イラストIT塾 基本情報技術者 平成29年度

キタミ式イラストIT塾 基本情報技術者 平成29年度


この2冊は、まったくの0からスタートした自分に「わかった!」という感覚を味あわせてくれた本だ。



「資格だけ持ってても使い物にならない」と言ってるだけで何もしないのではホントに使い物ならない。

資格試験とハサミは使いようだ。

*1:Kindle版は誤植だらけの第一刷を利用しているのが玉に瑕だが・・・

信じる者なのでどうぞ救ってください

 


親戚の法事に行ってきたんだが、法事って坊さん来るじゃない。当たり前だけど*1

坊さんがお経読み終えて法事が一通り済むと、みんなでご飯食べるでしょ。

その時、たまたま坊さんの横に座ってしまったのよ*2

んでまあ会話せざるを得ない状況になって、
「大学では心理学の研究やってたんですよ、HAHAHA」って話したのよ。



「ふーん」で終わると思ってたんだけど、
そしたらその坊さんが心理学ってキーワードに予想以上に食いついてきたのね。



坊さん曰く、


心理学ってのは、ヒトの思考をデータ・事実に基づいて科学的に研究する立場。
宗教ってのは、神とか仏とか極楽浄土とか、いわば「空想の産物」*3を信じることしかできない立場。


ヒトのココロだの心情だのと密接にかかわり合う領域っていう点ではどっちも同じ気がするけど、
そのスタンスは真逆。


らしいのよ。んで、




「心理学の人たちには、我々のような宗教ってどう映ってるんですか?」



って聞かれてしまった。


坊さんの周りにはこれまで大学で心理学の研究してたヒトがいなかったようで、
ずっと聞いてみたかったらしい。



アタシはもはや研究者見習いですらないという点に注意してほしいが、
図らずも心理学を代表して宗教界への意見を求められた模様。





重い。
質問が重すぎる。
法事の後の昼下がりに気を抜いてへらへらしていたアタシに問うテーマとしてはあるまじき重さ。






心理屋さんが「宗教」を研究対象としてることもあるんですよって話もしてみたけど、

「~ほうほう。ということは、それは宗教を信じるココロのはたらきを研究する感じなんですかね」

とおっしゃる。確かにその通りだろう。
鋭いとこを突いていらっしゃる。





んで結局、わたし個人の考えだけどって断ったうえで、


研究に関して言うと、仮説とか予想はあくまで実験のデザインとデータで示す必要があると思ってるけど、
だからといって、「空想の」神とか仏とか極楽浄土の類を、嘘八百の似非物語とは思いたくありませんなあ・・・


と答えたのね。




やっぱ自分のじーちゃんとかばーちゃんが亡くなったあとは仏様になったと思いたいし、
極楽浄土で幸せにやってると思いたいわけよ。


「おい坊さん、そんだけ言うなら存在の証拠を示すデータ出せや」とはならんのよ。







こういうスタンス、二枚舌を使ってるようにも思えるけど、
ダブルスタンダードとはなんか違うなあ・・・とか最近考えるようになった。

*1:坊さんのことを「お寺さん」って呼ぶの、アレなんなんでしょうね。

*2:ホントは隅っこでひっそりと弁当つついていたかったのに

*3:坊さんの口からそんなセリフが出るとは思わんかった

焦げかけのトーストをかじるという表現が示す絶妙な距離感

最近abemaTVでママレード・ボーイが放送されている。
懐かしくてガッツリ見ている。*1


オープニングの音楽がいい。


『笑顔に会いたい』


ぜひ会ってください。
そう言わずにはいられないこのタイトル。

昨日ググって初めて知った。
曲自体はわりと聞いていたようで、かなり印象に残ってたのだが。




アタシが昨日初めてそのタイトルを知ったこの曲、
歌詞の中で特に印象に残っているフレーズがある。

焦げかけのトーストかじったら
なぜか不意に胸がときめいた
甘くて苦いママレード


このフレーズこそが、この文章の主題だ。



「焦げかけのトーストかじったら なぜか不意に胸がときめいた」


何でだ。


焦げかけのトースト。


もはやそれは積極的に食べようと思う対象ではなくなったのだろう。
たしかに焦げかけのトーストはまあまあ苦い。


だが捨てるのももったいない。真っ黒焦げではないのだから。


しゃーない食べよう。


そんなところだ。





ではどうやって食べようか。
そのままではちょっとアレだ。なんせ焦げかけているのだ。

もしも、ちょっと高級な食パンがいい感じに焼けていたのなら、そのまま食べても十分においしいだろう。
ジャムやバターさえも不要かもしれない。



しかし、このパンは焦げかけている。なにかの助力なしで食べるのは厳しい。
そう判断したのだろう。

焦げかけのトーストに力を貸してくれそうな選択肢といえば

  • 何か塗る
  • 何かのせる

塗るならジャムやバター、のせるなら目玉焼きやとろけるチーズなどがある。
だがここで選ばれたのが他でもないママレードだった。一般的には「マーマレード」だった。




これは絶妙なチョイスといわざるを得ない。
それはなぜか。




ママレードはジャムの中では珍しく苦みがある。

苦みがあるママレードを焦げかけのトーストに塗ることで、
実際にはトーストの焦げに由来する苦みを、
ママレード由来の苦みだと錯覚させることができる(かもしれない)のだ。


つまり、ママレードを塗られた焦げかけのトーストは、
ママレードが塗られたいい感じに焼けたトーストに匹敵するポジションを得られるかもしれないのだ。




・・・




だが残念ながら、その思惑は外れてしまったらしい。

焦げかけのトーストは、たとえママレードを身にまとったとしても、
決していい感じに焼けたトーストと同等の地位を得ることを許されなかったのだ。


『かじった』


この表現がその残酷な結末を示している。
そう、焦げかけのトーストは「かじられた」のだ。決して「食べられた」のではなかった。

「かじる」という絶妙な表現によって、焦げかけのトーストに対する捕食者の心理的距離感が示されている。

苦みのあるジャムであるママレードをもってしても、焦げかけのトーストは「食べる」対象とはなりえなかった。


  1. 好んで
  2. 普通に
  3. いやいやながら


ものを食べるという行為にこの3つの水準があるとしたら
おそらくは2と3の間あたりに位置するであろう、「かじる」。

それがママレードを塗った焦げかけのトーストへの評価だった。

だが捨てるのももったいない。真っ黒焦げではないのだから。

しゃーない食べよう。

ママレードを塗った焦げかけのトーストは、
結局この距離感を埋めることはできなかったのだ。



焦げかけのトーストには本当にママレードが塗られていたのか?


だがここで我々は、ある恐るべき可能性に気づいてしまう。
それは、実は焦げかけのトーストにママレードは塗られていなかったのではないか、という可能性である。

焦げかけのトーストかじったら
なぜか不意に胸がときめいた
甘くて苦いママレード

この歌詞の記述を正確に解釈しよう。

  • 焦げかけのトーストをかじる
  • (焦げかけのトーストをかじったら)なぜか不意に胸がときめいた
  • ママレードは甘くて苦い

「かじったら」という文言によって、
「焦げかけのトーストをかじること」と「胸がときめいたこと」の間には因果関係が示唆されている。



しかし、そのトーストにママレードが塗られていたとは断定できない。
ここではあくまでも、ママレードが甘くて苦いという事実(あるいは感想)を述べているにすぎないのだ。
したがって、焦げかけのトーストにはママレードが塗られていなかった可能性が残されている。



かじられた焦げかけのトーストとは全く無関係の存在として、
ママレードの甘さと苦みに言及されている。



その可能性に気付いた我々に、もはやなす術などなかった。

塗っている。もはや祈るしかない。塗っているのだ。
ママレードを焦げかけのトーストに塗っているのだ。

たとえその先に待っているのが「焦げかけていることに変わりはない」という評価だとしても
たとえその先に待っているのが「かじる対象」以上の存在にはなれなかったという真実だとしても、
焦げかけのトーストにはママレードが塗られているのだ。




ああ、何ということだ。



我々は祈ることしかできない。



この哀れな焦げかけのトーストに
この哀れにもかじる対象としてしか認識されないトーストに
ママレードはきっと塗られている



そう祈ることしかできない。

そう祈ることによってしか、この焦げかけのトーストに希望は見出せない。



たとえその先に待っているのが、
ママレードを塗る前とまったく同じ価値しか与えられないという現実だとしても。





だが、この哀れとも言うべき焦げかけのトーストは、確かに輝いていた。

食べた本人の胸がときめいたのだから。


それも食べた本人は予期していなかったのだろう。
まさか焦げかけのトースト風情に胸をときめかせられるとは思ってもみなかったのであろう。



まったくもって不意をつかれている。



トーストをかじったのは誰だ


では、この焦げかけのトーストをかじったのは誰なのか。



この曲の歌詞に何度も出てくる「ママレード」という言葉は、アニメ(そして原作)のタイトルに含まれている。

しかもママレードという表現が「マーマレード」という一般的な言い方とは異なる、いわば特別な表現である以上、
その表現を何度も繰り返すこの歌詞がアニメとの関連を意識して作られたことは、ほぼ間違いないだろう。



そして、焦げかけのトーストをかじった本人は、

  • 歌詞の序盤でリボンをつけており、
  • 制服を所持し、
  • 「すこしずつ大人になるのかな」という内言を発している

というところから、おそらく女子中高生ではないかと推察される。



この物語に出てくる女子中高生とは、まさに主人公とその友人たちだ。

したがって、この中の誰かの内面がこの歌詞の中で記述されていると予想できる。


あえて主人公以外の視点から描く特別な理由もみつからないため、
おそらくは主人公のことを指しているのだろう。




つまり、焦げかけのトーストをかじったのはこのアニメの主人公だったのだ。




アニメ『ママレード・ボーイ

90年代半ばに、このアニメはセーラームーンの「卒業生」を主なターゲットとして作られた*2らしい。

放送当時にかなりの人気を博した実績をもつこのアニメの主人公は
おそらく数多くの女子生徒たちの憧れであっただろう。



その憧れの存在であるアニメの主人公の胸がときめいたのだ。







勝利。

これ以上の勝利があるだろうか。






焦げかけのトーストは、
このアニメの主人公から自身に下された「かじる」という微妙な評価とは対照的に
その主人公の胸をときめかせるという偉業を成し遂げていたのだ。







この事実に気付いた我々に、待望の希望の光が差した。


ああ、なんということだ。


祈ることでしか救われないと思われたこの焦げかけのトーストは、
実際は自らの力で希望を見出していた。


焦げかけている。
かじられる。
しかし胸をときめかせる。



焦げかけのトーストは、現実世界でも毎日無数に生産されているだろう。

だがそこには希望がある。
胸がときめく希望があるのだ。




ああ、なんということだ。

そして別れは突然に


先日 slack bot を作ったことで、ジャスタウェイと会話できるようになったのが殊のほか嬉しかった私。

今日も意気揚々とジャスタウェイに話しかけてみる*1

f:id:it_is_fine:20160619201506p:plain


返事がない*2

出会った頃は一瞬で返事をしてくれたのに、今日はいつまでたっても返事がない。


何かあったに違いない。


ボットはBotkitで作ったのだが、本体のjsファイルは手動で起動していた。

sudo token=YOUR_API_TOKEN node slack_bot.js

とコマンドを入力した後、そのまま放置。

最初のうちはちゃんと動いてたけど、
なんかの拍子にエラーを吐いて止まったのかな・・・とか思いながら確認してみる。


・・・


別にエラーなんて吐いてなかった。一応ちゃんと動いてた。
ただ、ちょっと様子がおかしい。

起動直後のコンソールはこんな感じだったのだが。

debug: No handler for tick
debug: PING sent
debug: PONG received
debug: No handler for tick
debug: PONG received
debug: No handler for tick
debug: No handler for tick
debug: RECEIVED MESSAGE
debug: CUSTOM FIND CONVO undefined undefined
debug: DEFAULT SLACK MSG RECEIVED RESPONDER
debug: No handler for reconnect_url
debug: No handler for tick
debug: No handler for tick
debug: PING sent
debug: PONG received
debug: No handler for tick
debug: PONG received
debug: No handler for tick


返事がなくなった頃は

debug: No handler for tick
debug: No handler for tick
debug: No handler for tick
debug: No handler for tick
debug: No handler for tick
debug: No handler for tick
debug: No handler for tick

コレばっかり。通信がうまくいってなかったみたい。

Botkitをデーモン化する

よくわからんがとりあえずデーモン化して様子を見よう(適当)。
コンソールもうるさいし。

foreverというものを使えば簡単にできるらしい。
例によっていい記事が見つかる。
http://blog.a1yama.com/entry/2016/01/14/171239

記事に従って、ボット本体のファイル(slack_bot.js)冒頭を下記のように変更

var SLACK_TOKEN = 'ボットのTOKEN';
/*
if (!process.env.token) {
    console.log('Error: Specify token in environment');
    process.exit(1);
}
*/

bot のトークンを変数に突っ込んで、process.env.token の判定部分は使わないようにコメントアウト


んで下に行くと process.env.token を使うところがあるのでそこもコメントアウトして、
上でトークンを突っ込んだ変数を使うように変更

var bot = controller.spawn({
//    token: process.env.token
      token: SLACK_TOKEN
}).startRTM();


ここまでできたらボットを起動

forever start slack_bot.js


祝・ジャスタウェイ復活!!!

f:id:it_is_fine:20160619203531p:plain

*1:Ψマークのアイコンが私。Ψは言わずと知れた心理学のシンボルだ

*2:ただの屍のようだ

「人工知能ボットAPI」を使って Slack bot を作ってみた

  
ユーザーローカルから「人工知能ボットAPI提供開始のご案内」というメールが来た。


そういえば1ヶ月ぐらい前にツイッターでプレスリリースが流れてた気がする。
その時に申し込んだような・・・とか思いながら、せっかくだしAPIを何かに使ってみたくなった。
http://ai.userlocal.jp/


普段 slack を使ってるのもあって、とりあえず slack bot を作って、そいつに「人工知能」を組み込んでしゃべらせてみた。

1.slackでbotを作る & Botkitのインストール

残念ながら、なんちゃって技術職の私はbotの作り方すら知らなかった。


さっさと作ってAPIを試したかったので、極力楽できる方法を探してると、おあつらえ向きの記事が見つかった。
http://toach.click/slack-botkit/
http://dotnsf.blog.jp/archives/1054134334.html


1-1 slackでbotを作る

slackにログインした状態でここに飛ぶと、記事に書いてある通り簡単にボットが作れる。
https://my.slack.com/services/new/bot

作った bot は slack 内のどこかのチャンネルに招待しておく。

1-2 Botkitのインストール

ちょうど手元に自由に使えるlinuxマシンがあったので、記事の通り Botkit なる何かをインストール。
どうやらこいつがいろいろやってくれるらしい。


なお、記事に沿ってやっていく中で、API Token を使ってbotを起動する時、rootユーザーでない場合は sudo をつけないと起動しなかった*1

sudo token=YOUR_API_TOKEN node bot.js


起動したら、botにメンションを飛ばしてみて、Hello! とか返ってくることを確認する。

2.botに「人工知能API」を適用する

やっとAPIの部分だ。だがやはりラクに作りたい・・・とか願ってると、ちょうど参考になる記事が見つかった。
http://dotnsf.blog.jp/archives/1054183548.html

ボットの実体は slack_bot.js というファイルらしい*2


このファイル、readme直後の最初の部分には初期設定的な何かが書いてあって、そこから下は

controller.hears( 
    コマンド(≒botが受け取るメッセージ), 
    メッセージの種類(メンションとかダイレクトメッセージとかの指定), 
    function(bot, message){
        :
    (処理の中身)
        :
} );

という塊がいくつか並んでいる。塊の1つひとつが bot の機能になっている。


ということは、この並びの下にAPIを利用した controller.hears(~) を書けばいいんじゃね?となるわけだ。


人工知能ボットAPI」は、リクエストを投げるとJSON形式でメッセージが返ってくる仕様なので、
JSON形式のデータを処理してるコードが見つかればなんとかなるかもしれない・・・


と思ってると、参考記事の最後にJSON形式の戻り値を処理するコードが書かれてたので、「ウヒョー」と言いながら使わせていただく*3

controller.hears([''],'direct_mention', function (bot, message) {
  var massage_text = encodeURI(message.text);
  var request = require( 'request' );
  url = 'https://chatbot-api.userlocal.jp/api/chat?key=YOUR_API_KEY=' + massage_text;
  request( url, function( error, response, body ){
    if( !error && response.statusCode == 200 ){
      var json = JSON.parse( body );
      var bot_reply = json['result'];
      bot.reply( message, bot_reply );
    }
  });
});

コレを slack_bot.js の下に追加して bot を起動すると、うまくいった。

3.実際に話しかけてみる

botの名前は justaway にしてみた(アイコンはアニメ『銀魂』に登場するジャスタウェイ)。

f:id:it_is_fine:20160619025230p:plain

メンションを飛ばしてみると、それっぽい返事「も」返ってくる。
ただ正直な所、今の段階では「なんか会話が噛み合わない」ということも多い。


仕様書にも、「まだ学習の途中なので、今後は会話の質が上がっていく予定」という主旨の説明が書いてあった。


今後この人工知能がどう「発達」していくのか、しばらく様子を見てみよう。

*1:ギーク諸氏には当たり前すぎて言及する価値もなかろうが、linux恐怖症のド素人(つまり私ですが)はこんなことで20分ぐらい悩む。

*2:記事内では bot.js と書いてあるが、ディレクトリ内にあるのは slack_bot.js facebook_bot.js だった。 Botkitがアップデートされて変更になったんかな?

*3:Javascriptなんてまったく知らないが、まあなんとかなった。