본문 바로가기
머신러닝/머신러닝 개발

파이썬 RDKit을 이용한 분자 유사도 (Tanimoto Similarity) 계산

by CHML 2023. 12. 19.
1. Tanimoto 유사도

분자 유사도 계산을 위해서는 분자의 표현 방식과 유사도 계산 방법을 정해야한다. 분자의 표현 방식에는 그림 1과 같이 fingerprint, 이미지, 그래프 등이 있다. 분자 유사도 계산 방법에는 그래프 유사도, dice 유사도, Tanimoto 유사도 등이 있다. Tanimoto 유사도는 주로 0과 1의 나열로 분자를 표현한 fingerprint에 이용되며, $M_1$과 $M_2$라는 분자 표현에 대해 아래의 식 (1)과 같이 정의된다.

$$\begin{equation} \mathcal{T}(M_1, M_2) = \frac{|M_1 \cap M_2|}{|M_1 \cup M_2|} = \frac{|M_1 \cap M_2|}{|M_1| + |M_2| - |M_1 \cap M_2|} \tag{1} \end{equation}$$

예를 들어, 두 분자를 표현하는 fingerprint가 각각 $M_1 = [1, 0, 1, 1, 1, 0, 0, 0]$과 $M_2 = [1, 1, 0, 1, 1, 0, 1, 0]$이라면, Tanimoto 유사도는 $3/(4 + 5 - 3) = 0.5$로 계산된다. 이 글에서는 파이썬 RDKit을 활용하여 화학정보학에서 가장 일반적으로 이용되는 Morgan fingerprint로 분자를 표현하고, 임의의 두 분자에 대해 Tanimoto 유사도를 계산하는 방법을 설명한다.

 

2. RDKit 설치

RDKit은 화학정보학 (cheminformatics)를 위한 다양한 기능을 제공하는 오픈소스 라이브러리이다. 기능은 C/C++ 언어로 개발되었으며, 파이썬에서 사용할 수 있도록 다양한 파이썬 인터페이스를 제공하고 있다. 특히 화학 머신러닝 분야의 구현들을 보면 대부분 RDKit의 기능을 이용하고 있기 때문에 화학 머신러닝 개발 및 연구를 위해서는 RDKit 설치가 필요하다. 파이썬 개발 환경에서는 아래의 pip 명령어를 이용하여 RDKit을 설치할 수 있다.

pip install rdkit

 

3. 파이썬 RDKit을 이용한 유사도 계산

먼저 아래의 파이썬 코드를 이용하여 문자열의 형태로 분자를 저장한 SMILES (simplified molecular-input line-entry system) 입력에 대해 Morgan fingerprint를 생성한다. RDKit의 `MolFromSmiles` 함수는 분자에 대한 SMILES 입력으로부터 RDKit의 분자 객체를 생성하는 함수이다.

from rdkit.Chem.rdFingerprintGenerator import GetMorganGenerator
from rdkit.Chem import MolFromSmiles

mol = 'CCCOC(=O)C'
fpg = GetMorganGenerator(radius=2, fpSize=2048)
fp_mol = fpg.GetFingerprint(MolFromSmiles(mol))

만약 우리가 `mol_db` 변수에 저장된 분자 데이터베이스를 갖고 있다면, 아래의 코드를 통해 입력 분자 `mol`과 `mol_db`에 있는 각 분자에 대해 Tanimoto 유사도를 계산할 수 있다.

from rdkit.DataStructs import TanimotoSimilarity

mol_db = [
    'OCC3OC(OCC2OC(OC(C#N)c1ccccc1)C(O)C(O)C2O)C(O)C(O)C3O',
    'Cc1occc1C(=O)Nc2ccccc2',
    'c2ccc1scnc1c2',
    'CCC1(C(=O)NCNC1=O)c2ccccc2',
    'CC(C)CCOC(=O)C',
    'CCOc1ccc(NC(=O)C)cc1'
]
fp_db = [fpg.GetFingerprint(MolFromSmiles(m)) for m in mol_db]

for i in range(0, len(mol_db)):
    print(mol_db[i], TanimotoSimilarity(fp_mol, fp_db[i]))

위의 구현을 통해 입력 분자 `CCCOC(=O)C`와 가장 유사한 분자를 검색한 결과는 그림 1과 같으며, 계산된 Tanimoto 유사도는 0.522이다.

Tanimoto 유사도 기반의 분자 검색 결과

위의 결과를 보면 `CCCOC(=O)`와 구조적으로 매우 유사한 `CC(C)CCOC(=O)C`가 검색된 것을 확인할 수 있다.

 

'머신러닝 > 머신러닝 개발' 카테고리의 다른 글

파이썬을 이용한 ChatGPT API 호출  (0) 2023.12.03