弱い紐帯の強さ的なアプローチのSAR
LeadOptimizationにおける合成戦略は基本的に新規な構造を追いかけるために、常にモデルを外れる傾向にある。だから精度が高すぎるQSARモデルはどうかなと思うことがあるし、あんまり最適構造にこだわんのもどうかな?なんて思ったりもする。また、あまりにも類似している構造が同じ様な活性を示すという情報は情報量的にあんまりだし、無駄に新規性を追求した結果、活性が残らなかったという状況もあれだ。
これってstrength of weak tiesに似ているんじゃないかと。つまり弱い紐帯のようなものをうまく探るのが、プロジェクトを先に進めるために必要なことのひとつであろうという仮説を立ててみた。
で、そういったネットワークを探索するのもなかなか楽しそうだ。
MCSを分解していってエッジを張って活性と類似度のバランスでエッジに重みをつけるっていうのはどうだろうか。構造は結構異なっているが適度に関連性があって活性があまり失われていないようなエッジはリードホッピングの道を指し示してはくれんじゃろか?
Dirichlet Process
chemoinformaticsにも使えそうなので色々読んでみている。
- Gaussian processes define a distribution over functions
- Dirichlet processes define a distribution over distributions
ぼんやりとした入門のそのまた入門の入り口ぐらいには立ったかなって感じ。CRPで遺伝子発現のクラスタリングをやっている論文があったので読む。
- Dirichlet Processes: Tutorial and Practical Course
- mots quotidiens.
- Ghahramani の UAI'05のスライド
- Dirichlet Process を用いた クラスタリング
- Clustering microarray gene expression data using weighted Chinese restaurant process
- Automated Discovery of Functional Generality of Human Gene Expression Programs
ディリクレ分布に関してはこの本見た。
Making Things Talk
セミナーで発表してきた
参加した皆様おつかれさまでした。
僕はというと、反応プログラミングを使った合成系人工無脳について、話させてもらいました。職場でトークしてもレスポンスが薄くて凹むのでこういう場は結構貴重だなぁと改めて。
- つかみをコードでってのは、ダメでしょうと同僚に言われたのでやめた。
- かわりにはてなーになりました!とかやってみた(謎)
- Random Forestはみんな使っているのね。僕も実際のデータでなんか使ってみよう。
- graphical modelingとかMCMCも探索系まで落ちてきそうな予感はするのでそっちもちゃんと押さえておかないとなぁ。
- そういえばInSilicoSpectroはどうなんだろう?職場で流してみたら華麗にスルーされたままだったので聞いとけばよかった。
帰りにパラパラめくってみて欲しくなったんだけど、PRMLにも書いてあるからなぁ。
先にこっちだな。
追記 20081107
リサンプリングの話でrandom forestはどうかっていう話が出た時に、あーそれもありかなみたいなぁとその場では思ったのですが、よくよく考えたらブートストラップサンプルで標本が重複してしまうからそれをうまいこと回避できるのかなぁ?と。
なんかいい方法あるかなぁ。あとでもう少し考えてみよう。
「最短経路の本」読んだ
グラフ版数学ガール的な本。ただし、数式はほとんど出てこなく、さくさく読めてお薦め。
「ダイクストラのアルゴリズム」に始まり、最小全域木と最短経路木の話があって、greedy algorithmとして「クルスカルのアルゴリズム」へ。
このあたりで、マトロイドが出てきたんだが、ここはいまいち理解できなかった。
さらに、オイラー小路、オイラー閉路の説明があって、「チュゴクの郵便配達員問題のアルゴリズム」でだんだん面白くなってきて、巡回セールスマン問題へ至る。
ここで、「1-木」とかいう話が出てきてちと悩む。「クリストファイズのアルゴリズム」やヒューリスティックな解放をいくつか通って、多面体組み合わせ論へ。ただし、これはイメージだけつかませるような内容になっていて、ここでこの本は終了。
GASTONとかgSpanに至には次にどんな本読めばいいんだろうかのう。とりあえずAmazonをみてたら面白そうなの見つけた。
- an introduction to fragment based drug discovery, why using fragments is a more efficient process than predominant models, and what it means to have a successful FBDD effort.
- setting up an FBDD project
- library building and production
- NMR in fragment screening and follow up
- application of protein-ligand NOE matching to the rapid evaluation of fragment binding poses
- target immobilized NMR screening: validation and extension to membrane proteins
- in situ fragment-based medicinal chemistry: screening by mass spectrometry
- computational approaches to fragment and substructure discovery and evaluation
- virtual fragment scanning: current trends, applications and web based tools
- fragment-based lead discovery using covalent capture methods
- case study from industry: the identification of high affinity beta-secretase inhibitors using fragment-based lead generation
広く浅くな内容な気がするがちょっと気になる。
GASTON
Nonnegative matrix factorization(NMF)でconsensus clustering
NMFを追っかけてたらMetagenes and molecular pattern discovery using matrix factorizationという論文を見つけたので、週末はこの論文を読みながら色々やってみた。NMFの便利なところは元の特徴(この論文の場合は遺伝子発現量)からより少ない任意の特徴量(論文中ではmetagene)に変換できるところであり、さらにそのままクラスターの分割に利用できる。
たとえば2つのmetageneで表現した場合、より発現量の大きいmetageneで分割すれば2つのクラスに分けられる。(QSARだったらdescriptorからmeta discriptorが導かれてそれに基づいてクラス分類ができるでしょう)
続いて、重要なのがクラスの安定性である。要するに最適なクラスタの数はいくつなのかということである。これに対して、この論文ではConsensus Clusteringというリサンプリングと隣接行列(connectivity matrix)を利用する方法をモディファイした方法を使っている。
ここで隣接行列はi番目のサンプルとj番目のサンプルが同じクラスなら1、それ以外なら0である。この行列のn回の平均値をコンセンサスマトリックスとする。コンセンサスマトリックスの値は0-1の間をとり、サンプルi,jが常に同じクラスになる場合は1、常に異なるクラスの場合は0である。フラフラするばあいはその間の値をとる。元の論文のconsensus clusteringアルゴリズムはデータの80%をランダムサンプリングして評価するのに対し、NMFの場合、初期値の行列はランダムな数字にしているので適当にループ(n)をまわすだけでよい。
NMFの実装は集合知プログラミングのものを用い、コンセンサスマトリックスを評価するコードをnumpyを使ってかいた。
import nmf
from numpy import *
def consensus(a,kstart,kend,nloop):
""" calculate consensus matrix
"""
(n,m) = a.shape
consensus = zeros((kend+1,m,m))
conn = zeros((m,m))
#i = 0
for j in range(kstart,kend+1):
connac = zeros((m,m))
for l in range(nloop):
#i += 1
(w,h) = nmf.factorize(a,pc=j)
conn = nmfconnectivity(h)
connac = connac + conn
consensus[j] = connac / float(nloop)
return consensus
def nmfconnectivity(h):
""" calculate connective matrix
"""
(k,m) = h.shape
ar = []
for i in range(m):
max_i = 0
max_v = 0
for index,v in enumerate(h[:,i]):
if v > max_v :
max_v = v
max_i = index
ar.append(max_i)
mat1 = tile(matrix(ar),(m,1))
mat2 = tile(matrix(ar).T,(1,m))
return array(mat1 == mat2, dtype=int)
これをcc.pyという名前で保存しテスト用のセットを適当に用意して実行。
from numpy import *
from pylab import *
import cc
kstart = 2
kend = 4
testarray = array([[0,0,1,1,1,0,0,0,0],
[0,0,1,1,0,0,0,0,0],
[1,1,0,0,1,1,0,0,1],
[1,1,0,0,0,0,0,1,0],
[1,1,0,1,0,0,0,0,0],
[0,0,0,0,0,1,1,1,1],
[1,0,0,0,0,1,1,1,0],
[0,0,0,0,0,0,1,1,1],
[0,0,0,1,0,1,1,1,1]
])
cons = cc.consensus(testarray.T,kstart,kend+1,20)
for i in range(kstart,kend+1):
pcolormesh(cons[i])
if i == kstart:
colorbar()
savefig('ccr' + str(i) + '.png')
見ればすぐ分かるが3つにクラスタリングできそうなマトリックス。
結果
2クラスタで分けた場合。

3クラスタで分けた場合

4クラスタで分けた場合

もうちょっと実際のデータでやってみないとあれだなぁ。それとConsensus ClusteringのCDFプロットみたいなのが欲しいところ。
参考書籍
参考論文
「インタラクションデザインの教科書」を読んだ
今の仕事で、data preparationのための効率的な仕組み(インタラクティブなサービス)が必要だろうなぁと感じているので、8章のサービスのデザインが参考になった。
- テスラーの複雑性保存の法則
- プロセスにはそれ以上単純化できない「臨界点」があり、それ以降は本来備わっている複雑性を移動できるだけだ
- フィードフォワード
- サファーの法則
- サービスの中にコンテンツをつくるよりもデジタルサービスの形を作るほうが簡単である
- スパイム
- space + time
- 状況認識し、セルフモニタリングしつつ自動的にドキュメント化
デザイニング・インターフェースも併せて読むとおもしろい。
pubchemのクラスタリングの結果をcytoscapeで見てみた
pubchemはクラスタリングの結果をgml形式でダウンロードできるので、それをcytoscapeで読み込んで解析することができる。早速データをとってくる。benzothioleで検索すると大体3000件くらいヒットするのでこれをクラスタリングしたものをgmlでダウンロードして、cytoscapeで読み込んでみた。

適当に描かせて眺めてみる。なんかネットワークっぽくなってますの。

さらに、ズームしてみる。

うーん、クラスタリングの結果を見てもちょっと面白くない。むしろ部分構造(MCS:Maximum Common Substructure)から構築したネットワークのほうがわかりやすいだろうな。
あとは、合成の時系列でネットワークをつくればいいと思うが、その場合、元々参考にした化合物の構造への情報をケミストから聞かなきゃいけないのでちょっとめんどいなぁ。
ということはpatentか?あれは先行技術の特許番号ついてたはずだからあれでネットワーク構築すればいいのか。これだったら、描いてみておもしろそう。
TODO: 奇麗な絵が描けるようにcydocなどを参考にちょっと勉強しとく
Chemistry::Mol
Chemistry::Molでちょっとはまった。
Can't call method "symbol" on an undefined value
というエラーでつまづいた。
my $mol2 = $mol->clone;
Makes a copy of a molecule. Note that this is a deep copy; if your molecule has a pointer to the rest of the universe, the entire universe will be cloned! my $mol2 = $mol->safe_clone;
Like clone, it makes a deep copy of a molecule. The difference is that the copy is not "exact" in that new molecule and its atoms and bonds get assigned new IDs. This makes it safe to combine cloned molecules. For example, this is an error:
# XXX don't try this at home!
my $mol2 = Chemistry::Mol->combine($mol1, $mol1);
# the atoms in $mol1 will clash
But this is ok:
# the "safe clone" of $mol1 will have new IDs
my $mol2 = Chemistry::Mol->combine($mol1, $mol1->safe_clone);



パターン認識と機械学習 上 - ベイズ理論による統計的予測
Making Things Talk -Arduinoで作る「会話」するモノたち
マツイ棒
マルコフ連鎖モンテカルロ法 (統計ライブラリー)
パターン認識と機械学習 下 - ベイズ理論による統計的予測
最短経路の本
Fragment-based Drug Discovery: A Practical Approach
集合知プログラミング
インタラクションデザインの教科書 (DESIGN IT! BOOKS)
デザイニング・インターフェース ―パターンによる実践的インタラクションデザイン