Python環境でScala風リスト操作をできるようにするパッチを書いた

abst

こういう書き方ができるようになるパッチ書いた

[1, 2, 3, 4].map(_ * 10).reduce(_ + _) 

motivation

かねてよりpythonmap,filter,reduceはうっとしくてかなわん、と思っていた。何より、 method chain にまったく向いていない。

例えば、Scalaでは以下の様なコード

val sum_evens = Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0).map(_ * 10).fold(0)(_ + _)

これが、Pythonではこうなる

sum_evens = reduce(lambda x, y: x + y, map(lambda y: y * 10, filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5])))

つらい。

pythonic とか Scala 使えとかいうのは忘れる。unpythonicで結構なのでこれを何とかしたい。

patch for built-in types

Python は monkey patch のやりやすい言語だが、built-in typesに対しては普通にはできない。方法はあるはずと探しに探したところ、強制的にパッチする gist をみつけた。

コメントには以下のようにある。

 # found this from Armin R. on Twitter, what a beautiful gem ;)

Python界隈では大変有名な Armin Ronacher 先生作らしい(結局オリジナルは見つけられなかった)。

これだ!というわけで、ざっくりまとめてgithubに上げた。

https://github.com/kogecoo/prototype.py

ネーミングは同僚より。

install

pipに上げたら怒られそうな内容なので上げてない。 cloneしてinstallする必要がある。

$ git clone https://github.com/kogecoo/prototype.py.git
$ cd prototype.py
$ python setup.py install

usage

先ほどのコードはこのように書けるようになる。

from prototype import itr
itr.attach()

[1, 2, 3, 4, 5].filter(lambda x%2 == 0).map(lambda x: x*10).reduce(lambda x, y: x+y)

さらに、Scala-like な lambdaを書けるようにする(fn.py)https://github.com/kachayev/fn.py を使えば、そこはもうScala World...

from prototype import itr
from fn import _
itr.attach()

[1, 2, 3, 4].map(_ * 10).reduce(_ + _)  #  100

調子に乗って、ScalaParSeq 的なこともできるようにした。

from prototype import par
from operator import add

par.attach()

def mult10(x):
    return x * 10

if __name__=='__main__':
    [[1, 2], [3, 4]].par().flatmap(mult10).reduce(add)

残念なことにmultiprocessingの制約があってlambdaは使えない。fn.pyも無理。 Pathosというライブラリがこれを解決しそうだけど、pipがダメなので気長に待とう。

最後に

やればやるほどScalaで書けよと自分で突っ込みを入れたくなった。

Myoが我が家に流れ着いた

 

f:id:kogecoo:20141218021514j:plain

 

 

そういえば首を長くして待っていたMyoが届いた。遅れに遅れてようやく発送されたのが10月で、やっと届く!と思ったのだけどいつまでたっても届かず、サポートに問い合わせたら4週間くらいよ、と言われ、船便だった事を知る。その後すっかり忘れた頃に届いた。

 
購入時に見なかったスペックを見たところ、9軸とある。ARMが乗ってる。通信はBLE。なんかすごいな。
Sensors
Medical Grade Stainless Steel EMG sensors, Highly sensitive nine-axis IMU containing three-axis gyroscope, three-axis accelerometer, three-axis magnetometer
LEDs
Dual Indicator LEDs
Processor
ARM Cortex M4 Processor
Haptic Feedback
Short, Medium, Long Vibrations
 
 このデバイス、特筆すべきは筋電の電極が乾式であるところ。コンシューマ向けって言ったら当然電極は乾式なんだけど、ようやったなぁという感想。    
 
 肝心のジェスチャー認識は4種あり、握り、開き、影絵のキツネ、あと突っ込みの時のアレ。4人位に試してもらった感じだと、一人全然ダメな人が居たが、それ以外は特に労せずキャリブレーションジェスチャをするだけでちゃんと認識する。筋電単体ではなくて他のセンサも併用して認識しているのかもしれないけど、よくわからない。    
 
SDKもパッと見た感じ一通りきちんと揃っていてリソースがちゃんとある雰囲気を感じたので、作ってるThalmic Labのメンバー一覧を見るとすごい人数。ですよね。  
 
当然ながらこういうのはアプリがあってなんぼだよなぁと思った。すぐにでもいじり倒したいが、最近バタバタしているので当分無理そう。

defaultdictのdefaultdict

pythonの標準ライブラリにdefaultdictという便利な道具がある。
ところでたまにdefaultdictのdefaultdictをやりたくなるが、いつも忘れていつも同じこのstackoverflowの記事に流れ着く。
毎度毎度検索しているので、ちゃんとメモればきっと忘れないはず。

普通の辞書ならこう

>>> d = {}
>>> print d["foo"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'foo'

で、defaultdictならこう

>>> from collections import defaultdict
>>> d = defaultdict(list)
[]
>>> d2 = defaultdict(int)
>>> print d2["bar"]
0

じゃあdefaultdictのdefaultdictなら、こう、と思ったら大間違い

>>> d = defaultdict(defaultdict(int))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: first argument must be callable

エラーが出てる。内容を読むと、 TypeError: first argument must be callable
とあるので、callableにしてしまおう。

>>> print d["foo"]
defaultdict(<type 'int'>, {})
>>> print d["foo"]["bar"]
0

なんかよくわからないけど動いた。これが答え。

さて、気持ち悪いから理由を知りたいという人は、前述のstackoverflowの記事を読むと良くて、きちんとなんでこれで動くのかにも触れている。

これをざっくりまとめると、defaultdict(some_type)はキーが無いときに、some_type()をcallする仕組みになってるから、という話。
馴染み深いint, float, str, unicode, dict, listなどの組み込み関数は、大抵型変換の時に使うが、これを引数なしメソッドとしてcallすると、零元相当(といっていいかは微妙だが。boolとかさ...)のものが得られる。

>>> int()
0
>>> list()
[]
>>> float()
0.0
>>> dict()
{}
>>> str()
''
>>> unicode()
u''
>>> bool()
False

ここで

defaultdict(defaultdict(int))

としてしまうと、デフォルト値を得るための内部の仕組みがdefaultdict(int)をメソッドとして呼ぼうとする。つまり、

defaultdict(int)()

こんな感じのコードが走ってエラーになる。
defaultdict(int)の空のインスタンスがデフォルト値になれば良いのだから、それを返す引数なし関数をdefaultdictに渡してやれば良い。つまり、以下のように書けば良い。

defaultdict(lambda: defaultdict(int))

ここまで書けば、きっと忘れない。

SynCha0.3.1が新しめの環境で動かないのを何とかする話

こちらで公開されているSynCha 0.3.1がエラーで動かないので何とかした。
以下の環境で試した

原因はperlのバージョンが新しいため、

for my $data qw(foo bar baz)

とは書けず、

for my $data (qw(foo bar baz))

と書く必要があるということだった。

この辺によれば、v5.14以前なら大丈夫なようだ(と思うが試していない)。 perl5のこのコミット以降で問題が起こる。

pull request送り先が無いのでを作ってgistにおいといた

cd syncha-0.3.1/
patch -p0 < syncha0.3.1_patch

これで大丈夫なはずだけど、後方互換は確認していない。

NLP勉強会#2で文脈自由文法の話をしてきた

NLP勉強会 #2 @dwango で話をしてきた。 内容は文脈自由文法の基本の話。

オーディエンスとしてどういう人が来るのかよく分からなかったので話す内容をどうするか大いに悩んだが、会の趣旨が自然言語処理の再学習ということらしいので、勉強会界隈では話されているのを見たことがない文脈自由文法というテーマで話してきた。

内容は形式文法、CFG、CKYアルゴリズム、PCFGをざっくりと数式なしで。

スライドは以下。

運営の方々、お疲れ様でした。
また、会場を提供してくださったdwango様、ありがとうございました。

アイビス2014見てきた

 もう先週の話だけど、怖いと評判?の第17回情報論的学習理論ワークショップ(IBIS2014)に聞き専で全日程参加してきた。
単なるエンジニア風情がもったいない限り。

技術、研究寄りな真面目なレポートは会社で共有した。頑張った。
ここではWeb上のチラシの裏らしく、当時の気分をポエムしておく。

1日目: チュートリアル

統計・機械学習の基礎

  • CRPとIBPが計3スライドで説明されていて世の中の進歩を感じる。
  • セミパラのよい文献を講師の方に要求したところ、このへんが良いと教えてもらった

機械学習に基づく推薦システム

  • 以前参加した統数研のトピックモデル講座でも講師をされていた方。
  • ベイズ的行列分解の話はICML2008で結構古いが知らなかった。悔しい。
  • GP拡張カッコイイ。
  • ハザードモデル使う推薦はソシャゲの人が聞いたら喜びそう。

音声音響信号処理のための確率モデルと学習アルゴリズム

  • 音声そんなに詳しくないからこの話は全体の概観と道具立てをひと通り知れてすごい良かった
  • トラジェクトリHMM実装したくなった。
  • 補助関数法勉強したくなった。

Pythonによる機械学習プログラミング

  • 場慣れ感。
  • 各論へのリンク集が嬉しい。
  • 結構細かいノウハウも話されていて勉強になってしまった。

2日目 企画セッション1 離散アルゴリズム機械学習応用

モンテカルロ木探索の理論と実践

  • 囲碁の盤面の評価関数作れた人は居ないんじゃないかな、という話が印象的。
  • 盤面の評価関数が不要というのは偉いという話。
  • ここでも多椀バンディット。
  • 細い一本道(勝ち筋が1つだけある)みたいなのに弱くて、将棋とかだと弱いというのは面白い。
  • A*とMCTSのゲームプレイにおける性格の違いが面白い

離散構造と離散分布

  • 途中からついていけなくなった。悔しい。
  • logicianに投げてみたら、資料をくれと言われた。うーむ。僕もほしいのだが。

大規模グラフ解析のための乱択スケッチ技法

  • LSHでなくてスケッチ技法っていうの?分野の違い?
  • 平易に説明しようという配慮がよく分かる感じで良かった。

招待講演:Deep convolutional network Neocognitron for visual pattern recognition

  • まさかのNeocognitron提唱者。
  • 歴史的経緯を聞けて楽しい。

招待講演:Deep learning: scaling and applications

  • Oxford / DeepMind っていうその所属は何なんだ。
  • 最初に福島先生への賛辞を述べておられてクールだって思った。
  • なんかもうDNNでなんでもいけるぜみたいな雰囲気。

3日目: 企画セッション2 学習理論

空間結合符号

  • 途中からついていけなくなった。また悔しい。
  • これは参考になりそうな資料が沢山あるようだ。

Wasserstein幾何とφ-正規分布

  • 手書きカッコイイ。
  • もちろん途中からついていけなくなった。
  • 確率論屋さんにこの話を振ってみたところ、セドリック・ヴィラニ(だったと思う)の話を交えて面白おかしく話してもらえた。

多腕バンディット問題

  • 昔は農地への作付物の選択、新薬、新療法の検証という話は始めて聞いた

招待講演: Current and Future Trends in Computer Vision

  • 過去にこの辺の分野をかすったことがあるので楽しく聞けたように思う。
  • 会場の反響音で、ただでさえ低いヒアリング能力値が削られまくって良くわからない箇所が多かった。スライドがほしいと思った。

4日目:ビッグデータ利用の社会的側面

産業領域におけるデータ活用への期待と現状

情報保護の統計モデル

  • k-匿名化はきつすぎる(という表現をしていたかどうかは覚えてないが)というフレーズだけやたら印象に残ってる。
  • 聞いたこと無い分布がたくさん出てきた。

ゲノムプライバシの保護と個別化医療への展開

  • SNPsの話
  • ゲノムプライバシは個人だけの問題ではないという話
  • なりすまし、冤罪に使われるかもという観点は初めて聞いた
  • 質疑で学習器が個人情報の塊では、みたいな話をされていて、以前似たようなことを考えたことがあったので掘り下げたくなった。

企画セッション4 期外学習のウェブデータ及びマルチメディア活用

大規模言語データに基づく自然言語処理とその応用

クラウドソーシング・デマ・MOOC

  • 構造学習やってる人だと思ってた。
  • クラウドソーシングの品質保証という全く知らなかった分野。
  • 同じような枠組みで様々な話につながっていて興味深かった。
  • ビッグデータ大学

ウェブ上のユーザ行動の分析による消費インテリジェンス

  • ゼクシィが結婚する人の90%が読んでるという話にざわめく
  • 勝敗ネットワークという道具があることを知る。
  • 知識発見らしい事例もあり、夏にビーサンが売れる話っぽい部分もあり。

ポスターセッション

  • IBISの醍醐味(らしい)
  • 議論が白熱している感ある。
  • あっちこっち回ってコメントしまくってきた。
  • 回ったところもメモっておいたけどさすがにここには書けない。
  • 医療を対象にした応用がちらほらあって、大変興味をそそられた(もちろん寄った)
  • YahooはCold Startと戦い続けている。
  • ぐうの音も出ないわ、という感じのポスターが(見た中で)2つあった。すごい。
  • どのポスターも濃かった。

Maker Faire Tokyo 2014に参加してきた

Maker Faire Tokyo 2014に出展で参加してきた。

f:id:kogecoo:20141123110428j:plain

そもそも見る側で参加したことすらこれまで無かったのだけど、
ひょんなことから参加することに。

みな趣味に走りまくっていて、好きなコトやってる感があり、 熱意が伝わってきてすごくいい。カオス感ある。 カオス感ある展示会だとデザフェスもそんな感じだけど、 Maker Faireは展示側がグイグイくる感じで、これはこれで新鮮だった。

自分が出したのは一発ネタ気味のものだったが、
まあまあウケたようで良かった。

個人的にはバットマンのバイク(チャリ)がすごい好きだった。

f:id:kogecoo:20141125004831j:plain

面白かったものはあげたらきりがないけど写りの良い写真があまりなかった。

あと、ガチャ回したらマフラータオルあたった。

f:id:kogecoo:20141123165556j:plain

また行きたいと思った。

「情報推薦システム入門」読んだ

持ってたし読んでたけど、通読してみた。
結構新しい話もカバーしてるし、レコメンドエンジンこれからやろうって人には全体を見通せるいい本だと思う。というか、これ以上の話って泥臭い現場の話とか運用の話くらいしか残ってないような...
これに加えて、「情報検索の基礎」でも読んどけば満点かも。

ただ、これ読んでスケールするシステム書けるとか、そういうものではない。ここに書かれている内容を実装しても、そこから運用までは結構遠い。内容が低級とか、高度な内容扱ってないとかそういうわけではなくて、それについては軸が違うので別ですよというだけ。
 とにかく、いい本。この手の話に携わっている人は皆持っていて良い。翻訳がたまに変になるのが少し残念。

「沈黙のことば」読んだ

 説明の必要が無いほど有名な異文化コミュニケーションについての古典。
high(low)-context cultures という概念を提唱したことで有名なエドワード・T・ホール先生の一冊(この本で直接の言及はない)
ご本人自身アメリカ人であるホール先生は、外国人とのコミュニケーションの際にアメリカ人はその自己文化中心主義から摩擦を生じやすいと考え、その解消には、特に明文化されていない暗黙のコミュニケーションへの理解が重要であるとしている。具体的な異文化コミュニケーションの失敗例、アメリカ文化との対比を織り交ぜながら、暗黙のコミュニケーションやルールがあるかを分析する本。
今になっては割と普通にいわれていることに読めるが、当時(50年も前)は一大センセーションだったそうな。

 もちろん今でも重要な考えだし、当然必要なことだが、一方で実行するのは極めて難し医用に思える。例えば、これは有名な話だけど、タイでは子供の頭を撫でると周りの人に怒られる。が、そんなこと日本人は大抵知らない。仮に知っててもついやっちゃう。加えて事前に調べるにしたって限度がある。
 じゃあどうするのがベストだろう。個人的な考えとしては、事前に調べるのは当然として、自分はこちらの文化にあまり馴染みがないので、是非教えてください、失礼があれば是非指摘し、助けてください、という関係を作れれば良いのでは、と考えた。
 このような態度は日本人特有のへりくだりの文化で、それこそ自国中心主義的なのかもしれない。ビジネスのような場でそれができるかも微妙なところな気もする。難しい。現代でマジョリティを得ている意見を知りたいところ。

 ところで、出版後50年経って、結局のところアメリカ人はアメリカの文化をTVやインターネットという形で輸出し、全体を馴らすことに成功したように思える(もちろん場所によるし、単なる思い込みかもしれない)。自分としてはその態度については全くニュートラルで、意見はない。ただ、多分このままこの形でマクロとしては進め続けるんだろうなあと思っている。ホール先生の意図とは少し違う形だけど、これはこれでひとつのやり方かもしれないなぁと思った。

「異端の統計学 ベイズ」を読んだ。

購入のきっかけはタイトル買い。
ベイズと付いてたら買わなければならない病気にかかっているので。

内容

 ベイズ統計が過去歴史の中で、どのような取り扱われ方をしてきたのかを紹介するもの。 塩野七生が書く系のジャンル。なんていうのあれ、歴史エッセイ?
もう少し言うと、ベイズ則とそれを下敷きにした道具立てに関わった人となり、
各時代におけるベイジアン的発想のの扱われ方、具体的な応用事例とその成功についての紹介。

良いと思ったところ

 類書は無さそうに思う。よく頻度主義、ベイズ主義みたいな話を耳にするが、
具体的に過去にどういう論争があったのか、どういう経緯で発展してきたのかを知らずに
ベイズの道具を使うことになってしまった、というようなタイプの方には良いと思う。

気になったところ

 無駄に厚く、文章が読みにくい。これは翻訳のせいではなくて、原文のせいだと思う。

 要所要所で、事前確率等の専門用語の説明がさわり程度というか、妙だ。そのため、なんだかわかったような分からないような…というようなという感じのまま、しかし理解している前提で話が進んでいく。そのため、後の文章でこれには批判があった、というようなことが書かれていても、一体どこを問題にしているのかが大変わかりにくい、または分からないということが何度かあった。
たとえば、ギブスサンプラーの解説はこう。

ギブズ・サンプラーマルコフ連鎖モンテカルロ法の一種。変数がたくさんある場合に、各ステップでただ一つの変数に注目するという形で、順次着目する変数を変えてサンプリングを繰り返す

これは分かっている人向けの説明だし、この説明の前にMCMCの話は出ていないため、最初の一行が既に無意味。一体だれのための説明なのか、そもそも歴史エッセイにこのような説明が必要なのか、と首をかしげてしまう。よって、この分野全然知らない人には勧められない。

 また、行きがけの駄賃と言わんばかりに解説のない専門用語、些細なエピソードを、「ついでに」挟んだような文章が頻繁にある。ベイズというキーワードに共起する専門用語を文章中に必ず含めなければいけない呪いにでもかかっているのだろうか。調べた内容はすべて書かないといけないと思っているのだろうか。

 これらが無ければ1/3くらいの厚さの本になっていただろう。この点は、先述の点と相乗効果を発揮し、読みにくさに拍車をかけている。

まとめ

 厚いし読みにくいので読了までの時間が長く、コスパが低い。
扱っている内容は良いと思うので、関連する分野の人で時間に余裕のある人は読んでもいいかも。

 ところで「異端」という言葉を煽りに使いたかったのかな、という勘ぐりをしたくなるくらい邦題と原題は違う。
原題は以下。こちらの方が内容とあっていると思う。

The Theory That Would Not Die: How Bayes' Rule Cracked the Enigma Code, Hunted Down Russian Submarines, and Emerged Triumphant from Two Centuries of Controversy

とはいえ、タイトル買いしてしまった自分には商業主義を呪うことくらいしかできない。