覚えておくためのメモ
以下はMochimasa氏のQiitaエントリ化合物をベクトルにして比較しプロットするを参考にしました
np.zeros()
の使い方は0を要素とする配列を生成するnumpy.zerosの使い方を参考にしました
モジュールはRDkitとNumpyを使う
# モジュールの読み込み
from rdkit import Chem
from rdkit.Chem import MACCSkeys
from rdkit import DataStructs
import numpy as np
化合物をSMILES形式で読み込む(ChEMBLで取得)
MACCS Keysの計算
mol = Chem.MolFromSmiles('CS(=O)(=O)NCCC1CCN(CC1)c2ncnc3cc(sc23)C(=O)N')
fps = MACCSkeys.GenMACCSKeys(mol)
fpsにMACCS keyが入っているはずなのでprint
してみよう
print(fps)
<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x10aef65d0>
BitVector?なのでそのままでは数値や文字としては表示できない
Tanimoto係数などSimilalityはBitVectorのまま比較すればよい
fp_bits = tuple(fps.GetOnBits())
print(fp_bits)
(32, 33, 36, 38, 51, 55, 58, 60, 61, 62, 65, 67, 69, 73, 75, 77, 80, 81, 82, 83, 84, 85, 86, 88, 91, 92, 93, 94, 96, 98, 100, 101, 102, 104, 105, 106, 108, 110, 111, 112, 116, 117, 118, 120, 121, 122, 124, 125, 128, 129, 130, 131, 133, 135, 136, 137, 138, 142, 145, 146, 147, 148, 151, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165)
MACCS KeysのどのbitがOn,つまり"1"になっているかを示す
これをnumpyで1 or 0のベクトルとして表すと
fp_arr = np.zeros((1,))
DataStructs.ConvertToNumpyArray(fps,fp_arr)
print(np.array(fp_arr))
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 0.
1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.
0. 1. 0. 0. 1. 0. 1. 1. 1. 0. 0. 1. 0. 1. 0. 1. 0. 0.
0. 1. 0. 1. 0. 1. 0. 0. 1. 1. 1. 1. 1. 1. 1. 0. 1. 0.
0. 1. 1. 1. 1. 0. 1. 0. 1. 0. 1. 1. 1. 0. 1. 1. 1. 0.
1. 0. 1. 1. 1. 0. 0. 0. 1. 1. 1. 0. 1. 1. 1. 0. 1. 1.
0. 0. 1. 1. 1. 1. 0. 1. 0. 1. 1. 1. 1. 0. 0. 0. 1. 0.
0. 1. 1. 1. 1. 0. 0. 1. 0. 1. 1. 1. 1. 0. 1. 1. 1. 1.
1. 1. 1. 1. 0.]
np.zeros((3,4))
で3x4の行列, つまりnp.zeros((1,))
では1行だけの,0が並んだベクトル
これをひとつひとつの化合物に適用して積み重ねた行列を作れば、PCAができる...!