분자를 graph로 표현하는 방법
Graph는 node와 edge로 표현되며, node는 vertex(정점)이라고도 말한다. 분자의 독성을 예측할 때, fingerprint 등 다양한 방식으로 표현할 수 있지만 최근에는 Graph로 표현하여 분자의 정보를 더 잘 반영하도록 하는 연구가 활발히 이루어지고 있다.
분자의 원소는 node, 각 원소를 결합하는 방식은 edge로 표현하여 feature를 추출하는 것이다.
일반적으로 분자를 벡터화하는 과정은 아래와 같은 형식으로 이루어진다.
그렇다면 프로그램에서 그래프를 어떻게 나타낼까?
크게 인접 행렬(adjacency matrix)과 인접 리스트(adjacency list)로 나타낼 수 있다. 둘은 각각 그래프의 연결 관계를 2차열 배열과 리스트로 표현한다. 그래프 관련 이론들은 코딩 테스트 BFS, DFS 문제를 풀 때도 알아야 하므로 꼭 알아두어야 한다.
Code: SMILES식을 분자로 나타내기 (시각화, adjacency matrix)
화학 물질의 SMILES식을 받아 코드로 변환해보자
from rdkit import Chem
import networkx as nx
import matplotlib.pyplot as plt
nextworkx는 파이썬에서 그래프를 다루기 위한 가장 기초적인 패키지이다.
# define the smiles string and covert it into a molecule sturcture ------------
caffeine_smiles = 'CN1C=NC2=C1C(=O)N(C(=O)N2C)C'
caffeine_mol = Chem.MolFromSmiles(caffeine_smiles)
print(caffeine_mol)
입력받은 SMILES식을 분자 형태 (rdkit object)로 변환하였다.
print(caffeine_mol.GetNumAtoms())
print(caffeine_mol.GetNumBonds())
다음과 같이 분자에 포함된 원자의 개수와 연결 개수도 확인할 수 있다.
# conver rdkit object to networkx object --------------------------------------
#nextwork object로 변환
caffeine_nx = mol_to_nx(caffeine_mol)
caffeine_atom = nx.get_node_attributes(caffeine_nx, 'atom_symbol')
color_map = {'C': 'cyan',
'O': 'orange',
'N': 'magenta'}
caffeine_colors = []
for idx in caffeine_nx.nodes():
if (caffeine_nx.nodes[idx]['atom_symbol'] in color_map):
caffeine_colors.append(color_map[caffeine_nx.nodes[idx]['atom_symbol']])
else:
caffeine_colors.append('gray')
nx.draw(caffeine_nx,
labels=caffeine_atom,
with_labels = True,
node_color=caffeine_colors,
node_size=800)
plt.show()
RDKIT 분자 object를 Nextworkx object로 변환한 후, 시각화 한 결과
이러한 분자는 인접 행렬로 나타낼 수 있다고 하였다. 인접행렬로 나타낸 결과는 다음과 같다.
# print out the adjacency matrix ----------------------------------------------
matrix = nx.to_numpy_matrix(caffeine_nx)
print(matrix)
Code: SMILES식을 벡터로 나타내기
# import rdkit/networkx/graph2vec ---------------------------------------------
from rdkit import Chem
import networkx as nx
from karateclub import Graph2Vec
# import numpy/pandas ---------------------------------------------------------
import numpy as np
import pandas as pd
print(">>> read the data file ... ")
tox21= pd.read_csv('tox21.csv')
print(">>> data shape = ", tox21.shape)
print(">>> data columns = ", tox21.columns, "\n")
print(tox21)
print()
#SMILES 활용하여 mol 생성
print(">>> create mol from smiles ... ")
tox21['mol'] = tox21['smiles'].apply(lambda x: Chem.MolFromSmiles(x))
# define the function for coverting rdkit object to networkx object -----------
def mol_to_nx(mol):
G = nx.Graph() #빈 그래프 생성
for atom in mol.GetAtoms(): #빈 그래프에 atome 추가하기
G.add_node(atom.GetIdx(),
atomic_num=atom.GetAtomicNum(),
is_aromatic=atom.GetIsAromatic(),
atom_symbol=atom.GetSymbol())
for bond in mol.GetBonds(): #빈 그래프에 bond 추가하기
G.add_edge(bond.GetBeginAtomIdx(),
bond.GetEndAtomIdx(),
bond_type=bond.GetBondType())
return G
#mol활용하여 graph 생성
print(">>> create nx from mol ... ")
tox21['graph'] = tox21['mol'].apply(lambda x: mol_to_nx(x))
print(">>> create graph embedding ... ")
model = Graph2Vec() #graph 벡터로 만들기
model.fit(tox21['graph'])
tox21_graph2vec = model.get_embedding()
tox21_graph2vec = pd.DataFrame(tox21_graph2vec)
print(">>> tox21_graph2vec shape = ", tox21_graph2vec.shape)
print(tox21_graph2vec)
print()
[Reference]
https://www.rdkit.org/docs/GettingStartedInPython.html
'AI > Toxicity Prediction' 카테고리의 다른 글
[Toxicity Prediction] 독성 예측과 GNN (0) | 2024.01.07 |
---|---|
[Toxicity Prediction] Class imbalance와 SMOTE (0) | 2023.05.05 |
[Toxicity Prediction] fingerprint / ECEP(extended-connectivity fingerprint) (0) | 2022.06.06 |
[Toxicity Prediction] 파이썬으로 SDF 파일 읽기/ 분자 데이터 SMILES식 확인하기 (0) | 2022.05.02 |
[Toxicity Prediction]Graph Learning / molecule (분자) data training의 과제 (0) | 2022.04.17 |