Monthly Archives: 8月 2015

SMBT: 類似構造検索


SMBT(Succinct Multibit Tree)は、簡潔マルチビット木を用いて、大規模な化合物データベースから、高速に類似構造の検索を行うことのできるソフトウェアです。
アルゴリズムの詳細は、SMBTの開発者のブログで紹介されています。

インストール

SMBTをFedora 20にインストールします。

入手先:https://code.google.com/p/smbt/
入手ファイル:smbt-0.0.1.tar.bz2

$ sudo yum install gcc-c++
$ tar -xzvf smbt-0.0.1.tar.bz2
$ cd smbt-0.0.1
$ make

smbt-0.0.1の下にあるprogに実行ファイルが出来ていますので、Pathを通します。

Fingerprintデータベースの作成

化合物のSDFは、先日の記事で利用した以下の2つのファイルを用います。

ks_10K.sdf: 検索対象
query1.sdf: クエリー

RDKitを用いてSDFからFingerprintを生成し、SMBTで利用されているFingerprintデータベースの形式に変換を行います。
ここでは、genfpdb.pyを作成し、変換を行いました。

genfpdb.py:

from rdkit import Chem
from rdkit.Chem import AllChem
import sys
import csv

if len(sys.argv) != 3:
	print "Usage python genfpdb.py input.sdf fp.dat"
	sys.exit()

csvWriter = csv.writer(open(sys.argv[2],'w'),delimiter=' ')
for m in Chem.ForwardSDMolSupplier(sys.argv[1]):
	if m is not None:
		fp = AllChem.GetMorganFingerprintAsBitVect(m, 2, nBits=1024)
		csvWriter.writerow(list(fp.GetOnBits()))

genfpdb.pyを使ってFingerprintデータベースを作成します。

$ python genfpdb.py ks_10K.sdf ksfp_10K.dat
$ python genfpdb.py query1.sdf query1fp.dat
$ smbt-build -mode 1 ksfp_10K.dat index

類似構造検索

imatinibとの類似性が0.9以上の化合物を検索します。

$ smbt-search -similarity 0.9 index query1fp.dat > out_t09.txt

ヒット化合物は、Fingerprintデータベースの115と223の分子であることが分かります。
out_t09.txt:

query id:0 num:2 115:1 223:0.942029 
average answers:2
average cpu time (sec):0.003566
variance:-nan

115と223の意味ですが、ksfp_10K.datの先頭から115と223番目の分子になります。ただし、0番から始まっているようです。
結果を確認したいので、openbabelを用いて、115番目の分子(openbabelでは1番から始まるので116番目の分子)を出力してみます。

$ babel -isdf ks_10K.sdf -osdf 116.sdf -f 116 -l 116

116.sdfは、imatinib(類似度1.0)でした。

次は、Self-similar searchesを行ってみます。

$ smbt-search -similarity 0.9 index ksfp_10K.dat > out_NN_t09.txt

out_NN_t09.txt:

query id:0 num:1 0:1 
query id:1 num:1 1:1 
query id:2 num:1 2:1 
query id:3 num:1 3:1 
query id:4 num:2 4:1 227:0.933333 
.
.
average answers:1.1208
average cpu time (sec):0.000572197
variance:0.000372935

驚くほど高速なソフトウェアだと思います。

chemfp: 類似構造検索


今回は、chemfpを用いて、類似構造検索を行ってみます。
chemfpでは、FingerprintをFPSというフォーマットに変換して利用します。

インストール

少し古いですが、Fedora 20にchemfpをインストールします。

$ sudo yum install gcc 
$ sudo easy_install chemfp

次に、openbabelをインストールします。

$ sudo yum install openbabel
$ sudo yum install python-openbabel

化合物データの準備

検索対象となる化合物データとして、KinaseSARfariを使うことにします。

入手先:https://www.ebi.ac.uk/chembl/sarfari/kinasesarfari/downloads
入手ファイル:ks_compound.sdf.gz

ks_compound.sdfの始めから1万化合物を使うことにします。

$ gzip -d ks_compound.sdf.gz
$ babel -isdf ks_compound.sdf -osdf ks_10K.sdf -f 1 -l 10000

FPSの生成

化合物データは、openbabelのFingerprintを使ってFPSに変換することにします。
ks_10K.sdfですが、このsdfに含まれる”COMPOUND_ID”タグを化合物のIDとして用います。
次に、query1.sdfですが、imatinibを1つだけ入れています。ここでは、sdfのタイトル行に”imatinib”と記載しており、これが化合物のIDとなります。

$ ob2fps --id-tag "COMPOUND_ID" ks_10K.sdf -o ks_10K.fps
$ ob2fps query1.sdf -o query1.fps

K-nearest neighbor search

imatinibに類似した化合物を類似度の高いものから3つ取得します。

$ simsearch -k 3 -q query1.fps ks_10K.fps > out_3nn.txt

out_3nn.txt:

#Simsearch/1
#num_bits=1021
#type=Tanimoto k=3 threshold=0.0
#software=chemfp/1.1p1
#queries=query1.fps
#targets=ks_10K.fps
#query_sources=query1.sdf
#target_sources=ks_10K.sdf
3	imatinib	941	1.00000	56904	0.97101	1642	0.95172

Threshold search

imatinibとの類似度が0.9以上の化合物を全て取得します。

$ simsearch --threshold 0.9 -q query1.fps ks_10K.fps > out_t09.txt

out_t09.txt:

#Simsearch/1
#num_bits=1021
#type=Tanimoto k=all threshold=0.9
#software=chemfp/1.1p1
#queries=query1.fps
#targets=ks_10K.fps
#query_sources=query1.sdf
#target_sources=ks_10K.sdf
8	imatinib	941	1.00000	1642	0.95172	20867	0.92754	20926	0.91304	20252	0.90647	56904	0.97101	203071	0.90196	205409	0.90789

Combined k-nearest and threshold search

imatinibとの類似度が0.9以上で、かつ類似度の高いものから3つ取得します。

$ simsearch -k 3 --threshold 0.9 -q query1.fps ks_10K.fps > out_3nn_t09.txt

out_3nn_t09.txt:

#Simsearch/1
#num_bits=1021
#type=Tanimoto k=3 threshold=0.9
#software=chemfp/1.1p1
#queries=query1.fps
#targets=ks_10K.fps
#query_sources=query1.sdf
#target_sources=ks_10K.sdf
3	imatinib	941	1.00000	56904	0.97101	1642	0.95172

Self-similar searches

ks_10K.fpsに含まれる化合物において、それら全ての化合物ペアに対し類似度が0.9以上で、かつ類似度の高いものから3つを検索します。ただし、自分自身のペアは、検索の対象外となります。

$ simsearch -k 3 --threshold 0.9 --NxN ks_10K.fps > out_NN_3nn_t0.9.txt

out_NN_3nn_t0.9.txt:

#Simsearch/1
#num_bits=1021
#type=Tanimoto k=3 threshold=0.9 NxN=full
#software=chemfp/1.1p1
#targets=ks_10K.fps
#target_sources=ks_10K.sdf
1	84	65	0.93724
0	88
2	91	808	1.00000	1559	0.95745
0	92
1	95	1677	0.98824
0	98
.
.

ChemCom: UnionBit Treeによる高速な類似化合物の検索


今回は、ChemCom*を使って、類似化合物の検索を行ってみます。
ChemComには、Bit bound, kD Grid, MultiBit Tree, UnionBit Treeの4つのアルゴリズムが実装されています。また、Fingerprintは、FP2とMACCSの2つから選択できます。

*J. Chem. Inf. Model., 2015, 55 (7), pp 1292–1296

準備

ChemComは、Java Web Start(JavaWS)で提供されています。
まずは、以下のChemComのサイトにアクセスします。

ChemCom: http://bioinformatics.org/chemcom/

ページの中ほどにあるAVAILABILITYにlinkがあるので、そこをクリックします。
Javaのセキュリティにより、通常は以下のダイアログが表示されると思います。

chemcom_01

ChemComを使うためには、例外サイト・リストにhttp://bioinformatics.org/を追加しなくてはなりません。Javaのセキュリティ設定の編集をしたくない場合は、ChemComのソースコードをダウンロードし、アプリケーションとしてビルドするといいと思います。

[例外サイト・リストの編集]
Windows8.1ですと、[コントロールパネル]→[プログラム]→[Java]を選択することにより、Javaコントロール・パネルを起動します。

Javaコントロール・パネルのセキュリティタブで、例外サイト・リストの編集ができますので、http://bioinformatics.org/を追加します。

chemcom_02

例外サイト・リストの編集後、AVAILABILITYのlinkをクリックすると、ChemComが起動します。

chemcom_03

毎回Webサイトにアクセスしたくない場合は、デスクトップにChemComのショートカットを作り、起動させることもできます。

[ショートカットの作り方]
Step 1.
[コントロールパネル]→[プログラム]→[Java]を選択することにより、Javaコントロール・パネルが起動します。
Step 2.
一般タブの表示ボタンを押します。
Step 3.
Javaキャッシュ・ビューアが起動するので、ChemComを選択し、右斜めに向いている矢印のボタンをクリックします。
ChemComが表示されていない場合は、キャッシュにChemComがない状態ですので、ChemComのWebサイトのlinkから、ChemComを起動してみてください。

chemcom_04

上記の作業により、デスクトップにショートカットが生成されます。
chemcom_05

チュートリアル

ChemComを起動します。

Step 1: 入力ファイルの選択
化合物は、ZINCからランダムにSDFとして取得しました。取得したSDFに対しては、水素除去、座標を2Dにした後、IDタグを作成し、ZINCコードを付加しています。

Query SDF Fileには、上記SDFからランダムに10,000化合物を選択したSDFを、Database SDF Fileには、上記SDFからランダムに50,000化合物を選択したSDFを用いました。

Tags:では、IDタグを選択しています。ここで選択したタグが、化合物を示すIDの役割りをします。

chemcom_06

Nextボタンを押します。

Step 2: アルゴリズムの選択

Algorithm ModeでUnionBit Algorithmを、Fingerprint AlgorithmでFP2を選択します。Tanimoto係数もここで指定を行います。

chemcom_07

Nextボタンを押します。

Step3: 出力ファイルの設定
ここでは、Output CSV Fileのみチェックを入れています。
このCSVファイルには、Step2で指定したTanimoto係数以上の値をもつqueryとdatabae化合物のペアとその類似度が出力されます。

chemcom_08

Perform Comparisonボタンを押します。

Step4: 実行

類似化合物の検索が実行されます。
ここでは、類似化合物検索の各ステップにおける実行時間が表示されます。

chemcom_09

最後に、各アルゴリズムの実行時間を比較してみます。
ここでは、実行時間として、Indexing DatabaseとComparingの和を用いました。
(Intel Core i7-3630QM CPU@2.40GHz, RAM 8GB)

chemcom_10

Boundと比較すると、kD Grid, MultiBit Tree, UnionBitの3つのアルゴリズムは、明らかに高速であることが分かります。

KNIME: Fingerprintを使った機械学習


今回は、Fingerprintを用いて、機械学習を行ってみます。
Fingerprintを直接、入力ベクトルとして利用できるノードもあるのですが、ほとんどのノードでは、利用できません。
このような場合、Fingerprint Expanderノードを使って、Fingerprintを列に展開します。
例えば、1024bitのFingerprintの場合、各bitが1つの列に対応した1024の列で表現されることになります。
一旦、Fingerprintを列に展開してしまえば、ほとんどの機械学習のノードで利用することができます。
knime_mpml_01

訓練データ、テストデータは、以下のサイトにある化合物のlogS値(Huuskonen dataset)を利用しています。
入手先:
https://github.com/rdkit/rdkit-orig/tree/master/Docs/Book/data
ファイル名: solubility.train.sdf, solubility.test.sdf

各ノードの設定方法を説明します。
各ノードを配置、接続した後、ノードをダブルクリックするとConfigureが開き、設定を行うことができます

訓練データの入力

SDFの読み込みには、SDF Readerノードを使います。
File selectionタブでSDFファイルの場所を指定し、Extract molecule nameとExtract SDF blocksにチェックを入れます。

knime_mpml_02

Property handlingタブを選択し、scan filesボタンを押します。
SDF内のタブ名が表示されますので、SOL_classificationにのみチェックを入れ、OKボタンを押します。

knime_mpml_03
テストデータの入力ノードでは、solubility.test.sdfを指定し、残りの設定は、本ノードの設定と同じとします。

クラスデータの加工

SDFのSOL_classificationタグには、logS値が、low、medium、highの3つのカテゴリーで表現されています。Rule Engineノードを使って、lowは0、mediumは1、そしてhighは2と変更します。
本ワークフローには、クラスデータの加工ノードが2つありますが、設定は同じです。

knime_mpml_04

Fpの生成

Fingerprintsノードを使ってFingerprintの生成を行います。
ここでは、Fingerprint typeとしてCircular(ECFP2)を選択します。
本ワークフローには、Fpの生成ノードが2つありますが、設定は同じです。

knime_mpml_05

学習(Fp)

Fingerprint Bayesian Learnerノードを使って、学習を行います。
このノードでは、Fingerprintを直接、入力ベクトルとして取り扱うことができます。

knime_mpml_06

予測(Fp)

Fingerprint Bayesian Predictorノードを使って、テストデータの予測を行います。
ここでは、Append Crisp Class Predictionにチェックを入れ、予測結果を列として加えることにします。
ただし、ScoreがUse fix thresholdで指定した値(ここでは0)よりも、小さい値をもつ場合は、予測は行われずXXが予測結果として出力される設定とします。

knime_mpml_07

スコア

Scorerノードを使って、予測結果の評価を行います。
本ワークフローには、スコアノードが2つありますが、設定は同じです。

knime_mpml_08

Fpを複数列へ展開

Fingerprints Expanderノードを使って、Fingerprintを列へ展開します。
今回の主役のようなノードです。
このノードを用いることで、多くの機械学習のノードを使うことができるようになります。
本ワークフローには、Fpを複数列へ展開ノードが2つありますが、設定は同じです。

knime_mpml_09

列の抽出

Column Filterを使って、機械学習に必要な列のみを取り出します。

knime_mpml_10

学習

Naive Bayes Learnerを用いて学習を行います。

knime_mpml_11

予測

Naive Bayes Predictorノードを使って、予測を行います。

knime_mpml_12

以上で設定は終わりです。
ワークフローを実行した後、スコアノード上で右クリックしConfusion matrixを選択します。
Fingerprint Bayesian Predictorの予測結果を以下に示します。

knime_mpml_13

Naive Bayes Predictorの予測結果を以下に示します。

knime_mpml_14


利用したソフトウェア:
KNIME 2.11.3