フリーランチ食べたい

No Free Lunch in ML and Life. Pythonや機械学習のことを書きます。

JSPN2018: 第114回日本精神神経学会で「DPATの個別対応と決定要因に関する分析」というタイトルでポスター発表を行いました

JSPN2018でポスター発表を行いました

実際に話したのはボスなので、何というのが正確かはわかりませんが、ポスター発表の実際の研究部分を担当しました。

www.congre.co.jp

ざっくりとした背景と内容

DPATという自然災害などの後に、被災地域に入り、精神科医療および精神保健活動の支援を行う専門的チームがあります。

www.dpat.jp

このDPATは2016年の熊本地震の際にも稼働し、被災地の医療行為を行っていました。熊本地震のように被災地が広い場合は当然限られた人的リソースを配分する必要があり、今回も行っていたのですが、配分のやり方について、まだ知見が溜まっておらずヒューリスティックにその場その場で判断していました。震災後、配分方法のデータだったり、患者さん/症状、実際にどう対応したかのデータが集まってきたのでそれを元に適切なリソース配分方法だったり、それ以外の関連する気づきを得るのが今回の目的でした。

ポスター

f:id:mergyi:20180909194905p:plain

最後に

このようにポスターをブログに載せるというのはあまり一般的ではないと思いますが、こういった研究成果をエンジニア/データサイエンティストとして、どのように集約していくか、は難しいと感じている背景があります。アカデミックな領域だけで簡潔するのであればアカデミックなやり方で全て簡潔しますが、自分のようにエンジニア/データサイエンティストとして適切に評価を受けたい場合、アカデミック以外の方にもわかりやすくまとめられていることが必要になります。こういった課題を抱えている方はそんなに多くないと思いますが、自分だけではないと思うので他の方がどうやっているかを調べたり、自分なりに検討していきたいと思います。

PyCon JP2018のHPを作成しました。

PyCon JP2018

今年の5~7月に主に開発をしていたPyCon JP2018のHPが7月に無事完成し、ブログを投稿しました。自分はPyCon JP2018システムチームなので実装、調整で携わっていました。

pyconjp.blogspot.com

pycon.jp

自分の担当とコード

PyCon JP2018は Vue.jsのフレームワークである、nuxt.jsと、APIとしてGoogleAppsScriptを使って開発されています。自分はAPI側の実装全てとフロント側のスポンサーページの実装を担当しました。HPは主に3~4人で開発されています。コードは全てPublicになっているので誰でも見ることができます。

github.com

github.com

なぜ転載しているか

前回のブログに書かせてもらったとおり、Forkwellのポートフォリオサイトのために投稿しています。

blog.ikedaosushi.com

カリフォルニア大学サンディエゴのAlgorithmic Toolbox @ Courseraを修了しました!

ここ1ヶ月半くらいで、Courseraで「Algorithmic Toolbox」という名前のCSのコースを受けており、今週、6週分の授業・課題を全てクリアし今週修了証をゲットしました 👏

f:id:mergyi:20180902130629p:plain

https://www.coursera.org/account/accomplishments/verify/JKBYCPYP7U69

Data Structures and Algorithms

この授業が何かと言うと、Data Structures and AlgorithmsというSpecializationの第一コースです。Specializationとは、Coursera用語らしく(?)、一連のCourse郡を束ねた名前のようです。(Specializationについては解説してくださっている方がいるので、こちら参照。Coursera|Specializationとは : MOOCsブログ)

(Data Structures and Algorithms Course1)www.coursera.org

そして、Data Structures and Algorithmsの特徴を説明文を引用して説明します。

No other online course in Algorithms even comes close to offering you a wealth of programming challenges that you may face at your next job interview.

このSpecializationの特徴は、単なるアルゴリズムの解説だけではなく採用面接などで必要になるアルゴリズムのプログラミングスキルを身につけられる ということです。

Algorithmic Toolbox

www.coursera.org

Algorithmic ToolboxはSpecializationの第一コースということで、基本的な内容から始まります。下記のようにWeek6に分かれています。

  • Programming Challenges
  • Algorithmic Warm-up
  • Greedy Algorithms
  • Divide-and-Conquer
  • Dynamic Programming 1
  • Dynamic Programming 2

毎週プログラミング課題があり、Java/C++/Python/Javascript/Rustなどの中から好きな言語を選べ、理解を深めることができます。

Week1、Week2の「Programming Challenges」「Algorithmic Warm-up」はアルゴリズムの重要性や計算コストの考え方など基礎から始まります。Week3の「 Greedy Algorithms」から本格的にアルゴリズムの内容が開始され、課題も難しくなります…。

なので後半は結構大変でした。でもGreedy AlgorithmsやDynamic Programmingを実装できるようになったのは、とても便利で今度別の(ある組織の)ブログで書くと思いますが、早速現実の問題にも適用するタイミングがありました。

Computer Science Complex をCourseraで治療する

geek-out.jp

先月、GeekOutに僕が強く尊敬するエンジニアの1人であるHigeponさんの記事が掲載されていました。Higeponさんが「ComputerScienceにコンプレックスをずっと持っていた」と書かれていましたが、まさに自分も同じ悩みを持っています。今年エンジニア4年目に突入し、普段はなんとなくプログラミング出来てしまうのですが、「ああライブラリがいい感じにやってくれるからそれに頼り切って実装してるな」と無力感を感じてしまうんですよね。

きっと自分以外にも同じような気持ちを持っている人は多いのではないでしょうか。そんな方にこのコースはオススメです。個性豊かな講師陣で話を聞いてるだけで割と面白いですし、資料も説明も工夫が凝らされてます。全て英語なので、自分にとっては言語の壁も大きいのですが、説明が工夫されてるのでなんとかついていける、と感じてます。

修了証を集めるのがゲーム感覚で楽しい

Courseraで取得した修了証はLinkedInに追加できるので純粋にRPGで武器を集めるような感覚で楽しいですし、もちろん就職、転職にも活用することができます。 https://www.linkedin.com/in/yutaro-ikeda-8b1015147/

Data Structures and AlgorithmsはCourseraの中では有料のコースになってしまうのですが、十分受ける価値はあると思います。来週からCourse2のData Structuresに挑戦します。また修了したら感想を書きたいと思います!

www.coursera.org

なぜ動的計画法はDynamic「Programming」という名前なのか

Coursera「Data Structures and Algorithms」

ここ1ヶ月半CourseraでCSのコースを受講しているのですが、そこで動的計画法についての面白い話があったのでシェア。 www.coursera.org 「Data Structures and Algorithms」という課程の中の「algorithmic-toolbox」コースWeek5のテーマが「動的計画法」です。

動的計画法(Dynamic Programming)とは

まず前提として動的計画法とは何か?という話です。

Wikipediaより

動的計画法 - Wikipedia

計算機科学の分野において、アルゴリズムの分類の1つである。対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法を総称してこう呼ぶ。

細かくアルゴリズムが定義されているわけではなく、下記2条件を満たすアルゴリズムの総称である。

  • 分割統治法:部分問題を解き、その結果を利用して、問題全体を解く
  • メモ化:部分問題の計算結果を再利用する

抽象化された説明なので知らない方はピンと来ないかもしれませんが「アルゴリズムのグループの名前」であることと、「分割統治法」「メモ化」の2つの手法を使うという、認識でとりあえず問題ないと思います。具体的にはナップサック問題やレーベンシュタイン距離の計算に使われます。

なぜDynamic「Programming」なのか

動的計画法の英語名称はDynamic Programmingなのですが、なぜ上述したようにアルゴリズムのグループなのに、Programmingという名前なのか、というのはずっと不思議でした。

動的計画法」はリチャード・E・ベルマンという数学者によって1953年に考案されています。ちなみにベルマンは、動的計画法以外にもベルマン方程式やハミルトン-ヤコビ-ベルマン方程式を考案していたり、1976年にジョン・フォン・ノイマン理論賞と受賞したりと歴史的にも重要な数学者です。

リチャード・E・ベルマン - Wikipedia

Dynamic「Programming」と名付けられた理由は、動的計画法が生まれた背景にあると、Courseraの授業で教えてもらったのですが、調べていたらより詳しく動的計画法の生まれた経緯について書かれたPaperがあったのでこちらから引用させてもらい、ざっくりとして翻訳をしてきたいと思います。

https://pubsonline.informs.org/doi/pdf/10.1287/opre.50.1.48.17791

科学用語が大嫌いな国防長官WilsonとDynamic Programmingの誕生

The 1950s were not good years for mathematical research. We had a very interesting gentleman in Washington named Wilson. He was Secretary of Defense, and he actually had a pathological fear and hatred of the word, research

1950年代は数学は不遇だった。その当時の国防長官だったWilsonが研究/研究用語を病的に恐れ憎んでいたからだ、というようなことが書いてあります。この研究の中に数学が含まれているのだと思います。

His face would suffuse,he would turn red, and he would get violent if people used the term, research, in his presence.

もし彼の目の前で研究用語を使おうものなら顔が真っ赤になって攻撃的になったと。恐ろしすぎますね。

The RAND Corporation was employed by the Air Force, and the Air Force had Wilson as its boss, essentially. Hence, I felt I had to do something to shield Wilson and the Air Force from the fact that I was really doing mathematics inside the RAND Corporation.

The RAND Corporation(当時ベルマンが所属していた企業)は、空軍から仕事をもらっていて、空軍のボスはWilsonだったので、なんとしても数学的なことを社内でやっていると知られるわけにいきませんでした

What title, what name, could I choose? In the first place I was interested in planning, in decision making, in thinking. But planning, is not a good word for various reasons.

どうやらベルマンは最初は「planning」という名前を考えていたらしいのですが、色々な理由から良くないと判断したようです。

I decided therefore to use the word, ‘programming.’ I wanted to get across the idea that this was dynamic, this was multistage, this was time-varying—I thought, let’s kill two birds with one stone.

ベルマンは最終的に「programming」という名前を選択します。段階的要素と時間変動的要素を表した言葉ということで「dynamic」という名前も考えられました。これは前述した「分割統治法」「メモ化」が段階的に実行されていくことを表していると思います。

Let’s take a word that has an absolutely precise meaning, namely dynamic, in the classical physical sense.

この、古典的な物理学での力学系という意味でも全く正しい「dynamic」という言葉を使おうと決めます。この方も物理学での力学系との類似を指摘されていますが、この文章だけ読むとどちらかというと後付だったようで、非常に興味深いです。

qiita.com

It also has a very interesting property as an adjective, and that is it’s impossible to use the word, dynamic, in a pejorative sense. Try thinking of some combination that will possibly give it a pejorative meaning. It’s impossible. Thus, I thought dynamic programming was a good name.

また軽蔑的な意味にならないことも大事だったと書いてあります。あまりピンとこないような気もしますが、そういう時代背景だったのでしょうか。もしかしたらDynamic Programmingと似た部分のあるGreedyArgorithm(貪欲法)の存在も影響しているのかもしれません。

It was something not even a Congressman could object to. So I used it as an umbrella for my activities

最終的にDynamic Programmingは議員からの反対すらなく便利な道具として、その後ベルマンによって使われていたようです。ベルマンは数学的なセンスがあっただけでなく政治的な手腕にも優れていたというエピソードでした

まとめ

  • Dynamic Programmingが「Programming」と名付けられているのはその当時の偏屈な国防長官が原因だった
  • 身近で使われている言葉1つ1つにも歴史があって、歴史を調べると楽しいことがわかったりする
  • 本当はPythonのDPの実装例も載せたかったけど、とても長くなってしまいそうなので、それは次回以降で

(おまけ)Courseraの講師のクセが強い

ちなみに本題と関係ないのですが先生がめちゃくちゃ個性強くてウケました

f:id:mergyi:20180827002504p:plain

f:id:mergyi:20180827004701p:plain

「え…いきなり逆転裁判のゴドーみたいヤバい人出てきたんだけど」と思ったのですが、授業は簡潔でわかりやすかったです。笑

読んだ本(Pythonによるベイズ統計モデリング、基礎からわかる時系列分析)

最近読んだ本のメモ。 本当は他にも感想を書きたい本が5冊以上あるのだが、全部書こうとすると、結局出来なくてまた放置してしまうので書けるうちに書いておく。

Pythonによるベイズ統計モデリング: PyMCでのデータ分析実践ガイド

Pythonによるベイズ統計モデリング: PyMCでのデータ分析実践ガイド

Pythonによるベイズ統計モデリング: PyMCでのデータ分析実践ガイド

この本は今年2018年6月に発売されたばかりの本だけど、内容がそれなりに網羅されてるし、非常に読みやすいので、Pythonを使った実践ベイズ統計学の決定版になりそうだと思った。ちなみにこれが出る前は下の「Pythonで体験するベイズ推論」をよく人に進めていたが、階層モデルやノンパラモデルMCMCの理論面についての説明があまりなく、取っ掛かりとしては良いが、全体を俯瞰して見た時にはこちらの方がオススメできる。

Pythonで体験するベイズ推論 PyMCによるMCMC入門

Pythonで体験するベイズ推論 PyMCによるMCMC入門

何点か良いと思った点を挙げておく。

翻訳の質が高い、訳者の方の愛が感じられる

全体を通して違和感のある翻訳や内容がなかった。これは訳者の金子さんが長年の統計の実務経験をお持ちで、かつ大学の教授で指導経験もあること、そして、あとがきにも書いてあるとおり、原書に対しての愛が強いことが理由かなと思った。ただ翻訳が良いだけでなく、おそらく原著で説明が簡潔すぎるような部分は、訳者の方による補足内容と補足コードがある。また脚注の書籍に関してはすべて日本語版のリンクも記載されている。非常に丁寧な仕事だと感じ安心して読めた。

訳があまり良くないと言われている最近のベイズ本だと下の「ベイズ統計モデリング」(通称犬4匹本)がある、どうやらこちらは大学のゼミで翻訳したものをベースにしているんじゃないか?ということがAmazonレビューに書いてあった。

ベイズ統計モデリング: R,JAGS, Stanによるチュートリアル 原著第2版

ベイズ統計モデリング: R,JAGS, Stanによるチュートリアル 原著第2版

実はこの本も買ったのだだけど、確かにあまり読みやすくなく、途中で挫折してしまっている。(内容は良いらしいのでちゃんと読みたい)。本著はスイスイ読めて1~2日で読み終えられるのも魅力だ。

階層モデルの図解がとてもわかりやすい

これは実際見てもらった方がわかりやすいと思うのだけど、階層モデルは全て下のように図示されている。 f:id:mergyi:20180820003841j:plain この表し方自体もわかりやすいし、1つ1つのモデルに対して丁寧に毎回、図示してくれるのもとてもわかりやすい。後半に出てくる混合モデルのZIP回帰や多次元分布のモデリングなどはこの図で非常に理解しやすかった。

「この本の次にどうやって勉強していけばいいか」が詳細に書いてある

本著の特徴として「他のベイズ本の名前がバンバン出てくる」ということを感じた。 それらはほとんど「この本を読み終わったら次はどう勉強すればよいか」という文脈で出てきており、本著は「ベイズ統計学を学ぶ上での羅針盤」になり得る本だと思った。 上に既に挙げた「Pythonで体験するベイズ推論」や「ベイズ統計モデリング」は何度も何度も参照されている。他には下の「異端の統計学ベイズ」という統計歴史小説、のような本も参照されている。

異端の統計学 ベイズ

異端の統計学 ベイズ

Pythonで体験するベイズ推論」や「異端の統計学ベイズ」など自分が既に読んで質が高かったものが多く参照されており、この本に対しての信頼度も高くなった。

コード例がわかりやすい

他にも簡潔なコードが全てのセクションで記載されていて、手元で再現することができる。コードは下のGithubに全てあがっている。

github.com

全体的にオススメ

まずベイズを概念的に理解でき、理論的にもある程度理解でき、コードの書き方もわかるのでかなりバランスが良いと思う。演習もかなり充実していたので、実践してみてBlogに書きたいと思っている。

基礎からわかる時系列分析

こちらの本も今年2018年3月に発売されたばかりであり、タイトルやシリーズから期待して読んだのだが、内容の網羅性に関しては良かった一方、説明は親切というわけではなく、自分の体験として、「もう理解している部分は言っていることはわかるが、まだ理解できていない内容に関しては結局わからない」というものだった。最近色々な種類の本を読んでいて気づいてきたのだが、「良い本」の重要なエッセンスは「正しい内容が書いてある」のではなく、「今まで超えられなかった壁を超えさせてくれる」ことなのではないかと感じている。ただ、この本も誠実な内容だと思うので、「壁を超えられたら」復習としてもう一回帰って来たい。

【Selenium】JavascriptのObjectの状態変化を待機する

TL;DR

  • Custom Wait Conditionsとdriver.execute_scriptを組み合わせる

Seleniumで「ある特定の動作を待つ」

最近はSPA的なサイトが増えてきたので「求めているDOMがブラウザにレンダリングされた」後に「ある特定の動作をさせたい」という気持ちになるときは多いのではないでしょうか。 そういう場合のために、Seleniumには、「待機する」用のClassが用意されています。例えば WebDriverWaitexpected_conditions です。 公式ドキュメントの例ですが、下記のように書くことができます。

5. Waits — Selenium Python Bindings 2 documentation

下記の例の場合、「idがmyDynamicElementの要素が出現するまで10秒ごと待機する」コードになります。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

様々な条件で待つ

presence_of_element_located 以外にも下記のようにメソッドが用意されており、様々な条件で待機することができます。

* title_is
* title_contains
* presence_of_element_located
* visibility_of_element_located
* visibility_of
* presence_of_all_elements_located
* text_to_be_present_in_element
* text_to_be_present_in_element_value
* frame_to_be_available_and_switch_to_it
* invisibility_of_element_located
* element_to_be_clickable
* staleness_of
* element_to_be_selected
* element_located_to_be_selected
* element_selection_state_to_be
* element_located_selection_state_to_be
* alert_is_present

JS Objectをチェックしたい

ただ問題としては全てHTMLの条件をチェックするということです。 待機する要素が多数に渡る場合は全ての要素をチェックするのはかなりしんどいので「一連の動作が終わったあとに、あるJS Objectの要素が書き換わる」ことをチェックしたいケースは少なからずあるのではないでしょうか。そんな場合は上記のメソッドは使えません。

Custom Wait Conditions

そんなときに使えるのがCustom Wait Conditionsで自分で特定の条件を書くことができます。 公式のも例がありますが、最もシンプルな例ではないので、もっとシンプルに書くと第二引数に driver を受け取る __call__ さえあればOKです。 __call__ は「ある特定の条件を満たしていなかったら False をそれ以外は受け取りたい要素を返す」ように実装します。

class CustomCondition:
  def __call__(self, driver):
    some_value = driver.some_method()
    if some_value == “some_condition":
        return some_value
    else:
        return False

wait = WebDriverWait(driver, 1)
some_condition = wait.until(CustomCondition())

この例だと「1秒ごとに状況をチェックしにいって、Falseでなかったら終了(値が帰ってくる)」コードになります。

driver.execute_script でJS Objectの状況取得

あとはこの条件にJS Objectの状況を入れられれば任務完了になります。SeleniumからJS Objectを取得するには driver.execute_script メソッドを使えば良いです。

7. WebDriver API — Selenium Python Bindings 2 documentation

例えばグローバルに以下のようなオブジェクトがあった時に

foo = {bar: ‘hoge'}

下記のようにして値を取得することが出来ます。

value = driver.driver.execute_script(‘return window.foo.bar’)
print(value) # => hoge

組み合わせる

これをCustom Wait Conditionsと組み合わせるとこのようになります。

class CustomCondition:
  def __call__(self, driver):
    some_value = driver.driver.execute_script(‘return window.foo.bar’)
    if some_value == “hoge":
        return some_value
    else:
        return False

wait = WebDriverWait(driver, 1)
some_value = wait.until(CustomCondition())

これで「 foo.bar == “hoge” になるまで動作を待機する」コードが書けました。めでたしめでた;。

(古典)統計学と機械学習の翻訳テーブル

(古典)統計学機械学習では使う名称が全然違う

土日は医学系研究室で客員研究員として粛々と研究しているのですが、医学系の研究というのはまだまだ古典統計学が主流です。古典統計学を扱う時の問題は色々あるのですが、その中でも大きいのは機械学習と同じ概念なのに名称が違うことです。 これはけっこう大変で、自分は普段「機械学習の用語」で考えているので、「(古典)統計学の用語」で考えている教授や学生さんと話すときに脳をフル回転させて同時翻訳する必要があります。もはやバイリンガルみたいな気持ちです。

まぁ大変なだけだったら良くないけど良いのですが、ときどき認識の齟齬が発生したりして、それは実質的な問題なので、とりあえず今後間違いを減らせるように「翻訳テーブル」を作ってみました。

モデルに対する翻訳テーブル

(古典)統計学 機械学習 備考
重回帰分析 一般線形回帰モデル 一般化線形回帰モデルを(古典)統計学でなんと呼ぶのだろうか
従属変数(dependent variable) 目的変数(response variable) 数式ではY
独立変数(independence variable) 説明変数(explanatory variable) 数式ではX
要因, 質的変数 離散の説明変数 (古典)統計学では名義尺度、順序尺度などさらに分かれている
共変量, 量的変数 連続の説明変数
偏回帰係数, 回帰係数 パラメータ、係数
尤度関数 目的関数, 損失関数(符号は逆)

適宜更新していきたい

とりあえず今思いついたものを書き出してみただけなのですが、普段から言語の壁を感じまくっているので気付いたら書き足していきたいと思ってます。「これもあるよ!」という方がいたら教えてください。