真鯛で忘年会

沼津にある真鯛というお店で忘年会をしてきました。

1544163327

突き出しがカマ。右が鯛のサラダ

1544163329 1544163332

カルパッチョと揚げ物

1544163335 1544163338

鯛のしゃぶしゃぶ。これは美味しかった。

1544163341 1544163343

エモいケモインフォマティクス

創薬アドベントカレンダー 2018

6日目の記事 #souyakuAC2018 となります

それはつまり、 Python+RDKitはエモくないから、もっとエモい言語でケモインフォマティクスをやりたいということですな?

よし、やろう!

ところで、今どきのケモインフォマティクスといえばRDKit+Pythonが一般的だろうけど、その前はどうだったのかということを、自分の記憶とかブログのメモを頼りに歴史を振り返ってみようかと思う。ここ15,6年くらいの話になると思う。

LLでケモインフォ

LLをつかってケモインフォマティクスをやりたいという話が出始めたのが2000年過ぎくらいからだったと思う。バイオインフォマティクス分野ではオープンソースのツールをつかって研究をするのが一般的だったので、その流れでケモインフォマティクスにもオープンソースでやりたいというニーズが高まったように記憶している。その当時はケモインフォっていうかQSARのほうがポピュラーだったので統計解析パッケージのRとかでなんとかしようとしてたような。

ケモインフォマティックスが出たのが2005年だからそれより前は洋書しかなかった気がする(でも少なかった)

Rでケモインフォ (2003-2007)

前の会社に入った頃はSBDDとバイオインフォ、ケモインフォを並行してやっていて、その当時はbioinformaticsといえばBioPerl一択でperlばっかり書いてた。ただQSARはRを使っていて、SVMとかMLRとかしていた気がする。大体2003-6年くらいですね。

この当時は構造描画したり、記述子を発生する唯一のオープンソースライブラリがCDKだった気がするのでみなさん他言語からCDKを呼び出そうしてた気がする。RCDKもこの当時にはあった。

結論: Rエモくない

Perlでケモインフォ (2006-2008)

Perlは学生の時から書いていてい、もちろんその当時もperlユーザーであった私はもちろんperlからCDKを呼び出すためにInline::Javaをつかうということを思いつき実践していた。

一方でPerlMolっていうPerlで構造のマニピュレーションするためのモジュールが出てきて自分の中で高まりをみせた感があって気がする。日本人で他に使っていた人がいたかは知らんけど、RECAP書いたり、人工無能作れたりとなかなかよかった気がした。

結論: perlは若干エモかったがいまさら書きたいとはあまり思わない

Ruby でケモインフォ (2006)

エモいLLといえばRuby,そしてBioRubyの流れからのChemRubyというのがあって、描画がイケていたので使おうとしたけど、メンテナであった金久研の方が忙しくなって更新されなくなってしまったので、そういうものがありましたということで残しておく

ちなみにRuby関連で読んでおく本は「メタプログラミングRuby」と「Rubyで作る奇妙なプログラミング言語」ですね。

ProductName メタプログラミングRuby 第2版
Paolo Perrotta
オライリージャパン / 3240円 ( 2015-10-10 )


ProductName Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~
原 悠
毎日コミュニケーションズ / ?円 ( 2008-12-20 )


結論: Rubyのエモさがchemoinformaticsには注入されなかった

Jython + CDKでケモインフォ (2008)

私がPythonを真面目に書くようになったのが2006年ごろだったと思う。当時GAMESS FMO inputの生成スクリプトにbioperlのpdb parserをつかっていたのだけどやたら遅くて、ふとbiopythonのparserつかったらすごく速いことに感動してそのまま宗旨変えした。openbabelのbindingはperlもpythonもどっちもあったので両方つかっていた記憶がある。

Jythonだとpythonとjavaがうまく連携できるのでCDKとの相性が非常によろしかった。

けどJavaで書くのが面倒くさかったのとJavaのコード書いてもあまりテンションが上がらなかったのに加え、具体的なプロダクトにまで進みそうな仕事がなかったので、楽しんで終わっただけだった。

その他Javaで書かれたやつ(Scala, Clojure) (2009-)

ScalaやClojureを使う人が増えたり書籍も色々と出た結果、Javaで作られたchemoinformaticsのtoolkit(ChemAxonね)をScalaやClojureで取り扱う系のblogの記事とかはちょいちょいあって、「ほー、なるほどー」とか言って参考にしていたと思う。そのあたりのブログを探してみたけど今はなくなっているようだった。

結論: Scala面白いですよね、マルチパラダイム言語ってのがエモい。ChemAxonの製品つかっていたら今頃Scalarになってたかも

ProductName Scalaスケーラブルプログラミング第3版
Martin Odersky
インプレス / 4968円 ( 2016-09-20 )


関数型言語でChemoinformatics (2010-?)

2006年頃から関数型言語に傾倒しだして、趣味のプログラミングとしてHaskellを触りはじめlisp,schemeに傾倒していて関数型言語でchemoinformaticsやりたくなった。

Pythonしか書かんよ?っていう人でも、とりあえずプログラミングHaskellは読んでおくとよいでしょう。モナドは出てこないので、 関数型言語おもしろい! 感は味わえます。あとこれを読むとPythonのプログラミングがちょっと変わります。リスト内包表記とかzip系を多用する病気にかかります、あとラムダ式ね。

ProductName プログラミングHaskell
Graham Hutton
オーム社 / 2940円 ( 2009-11-11 )


次にすごいHaskell読めばいいと思います。読もう、読むべき

ProductName すごいHaskellたのしく学ぼう!
Miran Lipovača
オーム社 / 2940円 ( 2012-05-23 )


で、このあたりが分かりだすと色々やりたくなるわけですね。以下の論文読むと色々書いてあるけど、型安全とか参照透過性とか遅延評価バンザイとか実際コード書いていると欲しくなる。

で、Ouchなどを追いかけていたけどなかなか仕事で使う感じにはならなかったので結局python + openbabel(仕事ではOE toolkit)でコードを書いてた。

結論: Haskellはエモいけど、使えるライブラリがなかった ;-)

Pythonでケモインフォマティクス (2008-)

そんなわけで2008頃からPythonでケモインフォマティクスのコードを書くようになったんだけど、その当時はPythonistaも今ほど多くはなかったですね。暇だったのでこのブログとは別にケモインフォクックブック書いてた。ちょうどこの時期にopenbabelのpythonラッパーであるpybelが構造描画に対応したのでオープンソースでも使えるようになってきたと記憶している。でもscikit-learnはなかったのでpythonからRにアクセスできるRpyつかっていた。その当時は論文の実装Rだったし、PythonからR呼び出すのが都合が良かったと思う。scikit-learnは割と最近なんじゃないですかね。

それからRDKitがどのくらいから盛り上がってきたのかを調べるには日本のパイオニアとして作者にも認識されているpen先生のブログを追えばいいのですが、それによると大体2012年くらいですね。ただこの頃はopenbabel派が多かったのでRDKitが主流になるのはもう少し後のはずです。

一応openbabelとRDKitの違いを述べておくと、openbabel(OpenEyeも含む)はケミストリー寄りで、RDKitはケモインフォマティクス寄りです。なにが違うのと言われると、「違うよ、ぜんぜん違うよ!!!!」くらい違うんですが、openbabelは量子化学計算の結果を格納することを前提とした作りになっているのに対し、RDKitはそこは考慮されてないんですよね。

結論: Pythonエモくない、固い、カッチカチ

エモいケモインフォマティクス

ここから本題、前置き長かったわ。

エモいプログラミング言語といえば関数型でhaskellとかlispですが実はpythonによるlisp実装の一つにhyというものがあります。

インストールも簡単、みんな大好きpipで

pip install git+https://github.com/hylang/hy.git

と叩くだけでOK

入門用の参考リンクを3つほどあげておきます。

Pythonで書かれた活性予測のコードも

from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit import DataStructs
import numpy as np
from sklearn.metrics import r2_score
from math import sqrt
from sklearn.svm import SVR
from sklearn.model_selection import train_test_split

def svm(x_train, x_test, y_train, y_test):
    clf = SVR(kernel='linear').fit(x_train, y_train)
    y_pred = clf.predict(x_test)
    r2 = r2_score(y_test, y_pred)
    print('SVM: R2: {0:f}, RMSE:{1:f}'.format(r2, rmse))

def sdf_to_desc(sdf_file):
    fps = []
    targets = []
    nfps = []

    for mol in Chem.SDMolSupplier(sdf_file):
        fps.append(AllChem.GetMorganFingerprintAsBitVect(mol, 2))  # fingerprint
        targets.append(float(mol.GetProp("ACTIVITY")))  # activity

    for fp in fps:
        nfp = np.zeros((1,))
        DataStructs.ConvertToNumpyArray(fp, nfp)
        nfps.append(nfp)

    return (np.array(nfps), np.array(targets))

if __name__ == '__main__':
    descs, targets = sdf_to_desc("CHEMBL1827733_5HT2A.sdf")
    x_train, x_test, y_train, y_test = cross_validation.train_test_split(
        fps,
        acts,
        test_size=0.1)
    svm(x_train, x_test, y_train, y_test)

hyで書きなおすとあら不思議、括弧の多さがエモさの証、こんなにエモくなりました!

(import [rdkit [Chem]])
(import [rdkit.Chem [AllChem]])
(import [rdkit.Chem [DataStructs]])
(import [math [log10]])
(import [math [sqrt]])
(import [numpy :as np])
(import [sklearn.model_selection [train_test_split]])
(import [sklearn.svm [SVR]])
(import [sklearn.metrics [r2_score]])

(setv sdf_file "CHEMBL1827733_5HT2A.sdf")
(setv acts (map (fn [mol] (- 9 (log10 (float (mol.GetProp "ACTIVITY")))))
    (Chem.SDMolSupplier sdf_file)))
(setv fps (map (fn [mol] (AllChem.GetMorganFingerprintAsBitVect mol 2))
    (Chem.SDMolSupplier sdf_file)))
(setv nfps [])
(for [fp fps] (setv nfp (np.zeros '(1, )))
    (DataStructs.ConvertToNumpyArray fp nfp)
    (nfps.append nfp))
(setv Y (np.array (list acts)))
(setv X (np.array nfps))
(setv D (train_test_split X Y :test_size 0.1)) ;D:x_train, x_test, y_train, y_test
(setv svr (SVR))
(setv clf (svr.fit (get D 0) (get D 2)))
(setv y_pred (clf.predict (get D 1)))
(print "r2:" (r2_score (get D 3) y_pred))

マクロも使えるみたいだし、積んであったOn Lisp読むモチベーションが高まったわ。

ProductName On Lisp
ポール グレアム
オーム社 / 3990円 ( 2007-03 )


結論:AI創薬をうたうならば括弧を恐れず本物の人工知能言語であるlispをつかってエモいケモインフォをやるべき。

Mishima.syk #13をやります

ちょっと間が空きましたがMishima.syk #13をやります。

テーマはまだ決まってませんが、構造生成モデルのミニハンズオンなどできればいいなーという話はしております。 やってみたいことはあるんだけど、強化学習のところでCPUでいけるのかGPUないとキツイのかをチェックしてから やるかどうか決めようと思ってます。

尚、今回使用した写真は昨日の飲み会で食べた真鯛のしゃぶしゃぶとなります。

分生に行ってきた

10年以上ご無沙汰していた分生に行ってきました。昔と比べてバイオインフォのセクション減ったよなーというような話をしたら、「バイオインフォなんて技術だから実際の研究の一部として使ってるからポスター散らばってるんだよ!」と言われて、一応全ポスターチェックしたら、確かに散らばっていたので、ポスターチェック大変だなぁと思った。ただ分生のアプリ便利だったので他の学会でも取り入れてほしい。

あとはバイオインフォやってた頃の元同僚とか知り合いとかに会えたので良かった。

一日目は昼くらいに横浜着になってしまったので、何も考えたくないときの定番のポルタの地下の麻婆豆腐のとこにいき、山椒の効いた麻婆豆腐麺を食べた。うまし。

1543730672

夜は豚の味珍

やかん(焼酎ストレート)と足

1543730674 1543730677

頭と舌。舌は後から頼んだけどちょっと多かった。二皿が限界かな。

1543730679 1543730681

2日目はシェークシャックに。ハンバーガーは確かにうまいがポテトは重かった。 ハンバーガーだけでよかった。

1543730684 1543730686

夜景はきれい

1543730688 1543730690

ベアードでスモーク肉でも食べて帰るかと寄ってみたのだけど、まったく肉の気分ではなく ビールを一杯頂いて、ホテルに帰って仕事をしただけであった。夜は近所の揚州商人で軽めの ラーメン。

1543730693 1543730696

最終日は夕方までに帰らないといけなかったので、乗り継ぎ駅で家系ラーメン を食べた。菊名乗り換えだったらここもありかなと思うけど、家系ラーメン結構もたれますね。 右側は三島の乗り継ぎで30分くらい空いて暇だったので、果南ちゃんにサイン本をもたせてみた。

1543730698 1543730701

夕方いいことがあったので、リパブリューで軽く飲んだ。ポスター賞って学会の中で楽しむものなんかなと考えていて あまり重要視してなかったのだけど、細かいところまでわからない経営層にとってはものすごくわかりやすい指標らしく (社外からの評価ということになるので当然か、、)社内でも成果の一つとして評価されるみたいなので、社外発表する場合には積極的に狙っていくと良いと思います。本人のモチベーションにもなるしね。

1543730704 1543730706

良い科学は差を生む(2)

良い科学は差を生むので我々は良い科学を行わなければならないわけです。

ここに、N先生のありがたいお言葉をあげておきますが、

つまり、「化合物のグラフ表現ではきちんと化合物を記述することができない」ということを意味しているわけです(自明だけどね)。

なので、機械学習を利用してQM9の値を予測するってのはとても違和感がある。ただ、マテリアルインフォ系の方々と話していると「ab initioだと計算時間がかかるからコンベンショナルな計算方法があると嬉しい」っていう理由でこういう方法が望まれているようなので、そういう目的ではありかな?と思う。(適用範囲(aplicability domain)の問題とかもある半経験的な手法とどっちが良いんかな?と思わないでもないが)

でも、創薬系の活性予測とか物性予測という場面においては、量子化学計算の結果から出てくる値(energyとか双極子モーメント)とかを現状のグラフ由来のデータをつかって深層学習にかけると、なんか特徴量でてくるかもみたいな神頼みみたいな仕事はどうかと思う。そもそも潜在的に記述できてないデータをinputに突っ込んで記述できるようになったら錬金術じゃないのか?

むしろ、量子化学計算の結果として出てきたパラメータを機械学習のinputとして利用するように色々工夫したほうが良いのではないかと考えている。リガンドとタンパク質の相互作用が化学反応の一種であるならば非占有軌道を考慮できないと正確な予測はできないと思うしね。

ProductName 基礎量子化学―軌道概念で化学を考える
友田 修司
東京大学出版会 / 4536円 ( 2007-02-01 )


curry二種

先週は久しぶりにチキンカレーを作った。

チキンをぶった切ってヨーグルトに漬け込む。クミンとかスパイスを炒めてから玉ねぎを炒めて、トマトを入れたら、ターメリックとか入れて水をちょっと入れてグレービーソースを作る。

1543315336 1543315339

その後ヨーグルトに漬けておいたチキンを入れて弱火で煮て、赤っぽい油がいい感じに浮いてきたら終了。大抵1時間弱放っておく。昔はカツ代のレシピで作っていたのだけど、トマト缶一缶入れると酸っぱすぎてカレー感が薄れるので、今は半分から1/3入れてる。フレッシュトマトを一個入れるのが一番美味しい。トマト缶は酸っぱすぎなので使いづらい。

1543315341 1543315344

こっちは東京に行ったときに寄ったバンゲラズキッチン。南インドのカレーだそうです、魚主体。

1543315353 1543315346

これは本当に美味しかったので次回も行きたい。

1543315348

AIをもって鶏を割く

今日はちょっとAIに関する発表をしつつパネルディスカッションに行ってきましたが、色々面白かったので書いておく。

要するにAIっぽい仕事をしている人間を集めてショートトークさせた後、パネルディスカッションするっていう構成だったんだけど、パネラーの中で手を動かせて深層学習、機械学習をわかるのはわたし一人で、残りはネットか本かで知識吸収っていう人たちばかりだったのでパネルディスカッション正直めんどくさいなーとしか思っていなかった。あとは事前打ち合わせなしのガチンコパネルディスカッションだったのでドキドキ感はあった。

最初の質問がいきなり「AI人材を育成するには?」という直球の質問で、私が最初の回答者に指名されたので、うっかりナイーブに「機械学習とか深層学習を学んで後はドメイン知識があればいいんじゃないですかね?」というアホな回答をしてしまった。残りのパネラーもわかってない感じの返答していたけど最後のパネラーが「マインドチェンジする必要があるんじゃないかな」みたいなことを言っていて、「ほう!」となった。これはあーなるほど面白いなと。

で、次の質問が私的にはキタのだけど、それは「AIは結局のところ差別化できない方向にすすむので当社の強みにならないと思うのだけど?」という質問でこれは非常に考えさせられた(5秒位w)。で、私が答えたのは「AIは確かに普遍化して差別化ポイントにはならないでしょう、それは技術でツールだから。でもその技術を以て何を為したいのかにオリジナリティがでるのでは?」という返しが出来て、私は実は賢いんじゃないかと思いました。ついでにすかさず先の「AI人材育成質問」を引き合いに出して「うちのチームは1年半前までは深層学習とかできなかったけど、何を為したいかがはっきりしていたから短期間で成果をだして、今は全員当たり前のように毎日ディープラーニングして課題解決しています」というようなアピール出来たので良かった。でもちょっと持ち上げすぎたので、成果よろしくお願いしたい。

あと全然関係ないけど、いい研究しても伝わらないと意味がないので、伝える努力もしたほうがいいかなと思います。よっぽど発表慣れしている人でなければ資料とかポスターのver. 5までは下書きです。査読者のコメントに熟慮を重ねないといけません。学会ポスターなんて多面最適化と一緒であっちの文言帰るとこっちの文言の整合性が取れなくなるし、図をいじると他のデザインとの整合性がとれなくなるので、納得いくまでいじるもんじゃないかなーと思っていたのだけど、こっちの会社に来てみなさんサクッとドラフトっぽいものを印刷出すのでそういう文化なのかなーということで納得しようとしていたら、帰りに一緒に飲んだ同僚(今日の発表資料をさんざん直された)に「そんな文化ないっすよ!」って言われたので書いておきます。

ver. 3で諦めて印刷にまわすのはスラムダンクの三井以下やぞw

今日思いついた一番の名言やと思いましたw

それから前の会社でみんなで心がけてた標語を思い出したのでこれも書いておきます。

「理解されてアドバイスもらえるのがベスト、わかってもらうのがベター、わかった気にさせるのがマスト」

まぁそんな感じです

京都に行ってきた

週末は所要で京都に行ってきた。

昼は今出川でブラックを食べた。ちょっと濃かったかな。

1542581769

途中、金平糖を入手

1542581772

日本人初のメダルらしい

1542581776

立食ではないディナー

1542581780 1542581783

1542581786 1542581789

1542581792 1542581795

帰り道に日本酒バーでちょっと飲んで帰る。

1542581797 1542581801

金魚

1542581804

鴨川と月

1542581807

綾った

お祝いで綾に行ってきました。楽しかった。すき焼き美味しかった。

1542498449 1542498451

1542498453 1542498455

1542498458 1542498460

1542498462

Hansch-FujitaのLogPはdesolvation energyでPIEDAのDI termはエンタルピックな項

週末は京都でkumainfoの座長の方々とお会いする機会があったので、予稿集を眺めて気になったところを質問してきました。

特に2B03の回帰式にdesolvation termが入っていたのでその意味を聞いたところHansch-Fujita equationのLogPではないかとのことでほう!となりました。ちなみに調べてみたら1984年くらいに同じこと書いてあった(p. 709)。

となるとPIEDAで出てくるDIはLogPとは関係がなく? スタッキングとかCH-πみたいな純粋なエンタルピックな量になってLLEとよい相関を示すことになるのかな?

一方でLLEは見かけの活性を排除しているわけではなくエントロピックな寄与を排除しているということになるが、これはエントロピックな寄与が一定という割と狭い条件でしか通用しないってことかもしれないですね。

konをいじるデザインも併せて考えると興味深いと思う。

このあたりの整理が出来たので良かった。