matplotlibでPCA

web.pyを使ってサービスを提供できるようになったので
何か使えないかな〜と考えて見た。
任意のSDFがあったらPCAやって結果を返すとかあると
PCAってなに?みたいな人もspotfireで図が見えるしいいかもと思った。
PCRの方がより良いと教えていただいたのでこちらの実装も考えよう。
さて、自分がやるならRを使うのだが、web.pyに入れるとなると全部pythonがいい。
rpy2入れたしこれで。と思っていたら動かないで肩すかし、、どうも社内の環境のwinで構築したR2.10はだめなようだ
RDKitのモジュールはもうメンテしてないし、matplotlibがいいじゃないと言われたのでそれで取りあえず書いてみました。

rom rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.ML.Data import Stats
from matplotlib import mlab
from pylab import *
import numpy
import sys

mols = [mol for mol in Chem.SDMolSupplier(sys.argv[1])]
fps = [AllChem.GetMorganFingerprintAsBitVect(mol,2) for mol in mols]

mat = []
for fp in fps:
    bits = fp.ToBitString()
    bitsvec = [int(bit) for bit in bits]
    mat.append(bitsvec)
mat=numpy.array(mat)
nrows = len(mat)
ncols = len(mat[0])

if nrows <= ncols:
    res = mlab.PCA(mat.T)
    proj = res.Y.T
else:
    res = mlab.PCA(mat)
    proj = res.Y

print "-"*20
print "ID","PC1","PC2","PC3"
for i in range(len(proj)):
    print i+1,proj[i][0], proj[i][1], proj[i][2]

print "Finish"
scatter(proj[:,0],proj[:,1])
show()

化合物数>ビット(2048)の場合はそのままでいいみたいですが、
化合物数<ビットの場合はそのままではエラーになるので転置します。
で最後にもう一回スコアを転置して第三成分までを出力。
手ものとのデータでやったらあまりぱっとしない感じ。
もちっとデータ集めてやってみる。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s