Fingeprint의 차원을 줄임으로써 화합물 공간을 시각화

2019/10/26

무료로 공개된 화합물 데이터 세트를 사용하여 화학 구조를 기반으로 화합물 공간(케미컬 공간)을 시각화해 봅니다.

동기 부여

화합물 공간의 시각화는,
・데이터 세트에 포함되는 화합물 중에 특이한 것이 없는가
· 어떤 화합물이 얼마나 포함되어 있는지
알아내는 데 도움이됩니다. QSAR 및 기계 학습 예측 모델을 작성할 때도 데이터에 외삽이 있는지 여부를 대략적으로 판단할 수 있습니다.

方法

Fingerprint 계산

각 화합물에 대해 Fingerprint를 생성하여 차원을 줄임으로써 평면에 plot할 수 있도록 합니다. Johnson과 Maggiora의 유사 성질 원칙 "유사한 화합물은 유사한 성질을 가진다"에 의하면, 유사한 구조·성질을 가지는 화합물끼리가 평면상에서 가까이에 분포할 것입니다.

시각화에 사용하는 fingerprint는 Morgan 지문과 RDkit 지문을 사용해보십시오.

참조: RDkit에서 사용할 수 있는 fingerprint

차원 축소 기법

차원 축소에는 주성분 분석(PCA)과 UMAP을 사용해 봅니다. PCA는 가장 자주 사용되지만 데이터 선형성을 기반으로 저차원 공간으로 압축하므로 fingerprint와 같은 0-1 데이터에는 적합하지 않을 수 있습니다.
반면 UMAP은 비선형성분을 고려한 차원 축소 기법 중 하나입니다.이 방법의 스테디셀러 t-SNE와 같은 차원 삭감을 수배의 속도로 완료할 수 있으므로, 큰 데이터 세트에도 사용할 수 있습니다.

클러스터링에는 kmeans 방법과 SpectralClustering을 사용합니다.
kmeans법은, ①클러스터를 랜덤하게 설치 Moon이나 Swiss roll 등의 비선형 데이터는 잘 분류할 수 없는 것으로 알려져 있지만, Spectral Clustering은 그러한 데이터에도 대응할 수 있다고 합니다. scikit learn의 치트 시트에서도 kmeans법으로 잘 되지 않는 경우의 선택이 되고 있습니다.

각각을 조합해, 정규 분포·선형 데이터를 전제로 한 「PCA × kmeans법」과 비선형 데이터 대응의 「UMAP × Spectral Clustering」로, 각각 해 보고 싶습니다.

덧붙여서, 화합물의 유사도 지표로서 자주 사용되는 tanimoto 계수(2개의 화합물간의 유사도를 0에서 1로 표현. 1과 같은 구조)을 기초로 화합물을 클러스터링하는 방법도 있습니다만, 이번은 시험 그렇지 않습니다.

참조: 고차원 데이터의 차원 축소 및 2차원 플롯 기법
   스펙트럼 클러스터링(SpectralClustering)(클러스터 분석)

화합물 공간을 시각화해 보자

데이터 세트에는 Molecule net의 Lipophilicity를 사용합니다.약 4200개의 화합물에 대해, 각각의 SMILES 및 실험에 기초한 logP(소수성 지표: 옥탄올/물 분배 계수)가 포함된다.

참조 :화합물 데이터 세트 목록

# package의 import import pandas as pd import numpy as np from sklearn.cluster import KMeans from sklearn.decomposition import PCA from sklearn.cluster import SpectralClustering import umap from rdkit import Chem from rdkit.Chem import inline # 데이터 세트 로드 df = pd.read_csv('Lipophilicity.csv') print(df.info()) df.head(5)


RangeIndex: 4200 항목, 0 ~ 4199
데이터 열(총 3개 열):
CMPD_CHEMBLID 4200 non-null object
exp 4200 non-null float64
smiles 4200 non-null object
dtypes: float64(1), object(2) memory usage: 98.5+ KB None

logP 데이터 세트

 

# Morgan 지문 및 RDkit 지문 가져오기mols = [Chem.MolFromSmiles(x) for x in df.smiles] morgan_fps = [AllChem.GetMorganFingerprintAsBitVect(x, 2, 1024) for x in mols] (x, fpSize=1024) for x in mols] # fingerprint를 DF에 저장 df_morgan_fps = pd.DataFrame(np.array(morgan_fps)) df_rdkit_fps = pd.DataFrame(np.array(rdkit_fps))

Morgan 지문은 한 원자에서 설정한 반경(radius) 내에 있는 부분 구조를 세어 갑니다. ECFP(Extended Connectivity Fingerprint) 지문과 유사한 알고리즘으로 Morgan의 반경 2는 ECFP4에 해당합니다.여기서는 radius = 2, 1024 bit의 fingerprint를 계산합니다.
RDkit 지문은 원자의 반경이 아닌 결합 길이를 기준으로 부분 구조를 계산합니다.이것은 Daylight 지문과 유사합니다.기본적으로 최소 경로 길이:1 조인 – 최대 경로 길이:7 조인까지 고려됩니다.

얻은 fingerprint는와 같은 object로, 그대로는 후속의 처리를 할 수 없기 때문에, 데이터 프레임으로 고쳐 줍니다.
 

# kmeans 클러스터링 kmeans = KMeans(n_clusters=8, n_jobs=-1) kmeans.fit(df_morgan_fps) # PCA에서 차원 감소 pca = PCA(n_components = 2) decomp = pca.fit_transform(df_morgan_fps) x = decomp[:,0 ] y = decomp[:,1] # 시각화 plt.figure(figsize=(15,5)) # kmeans 방법으로 얻은 클러스터로 색 구분 plt.subplot(1,2,1) plt.scatter(x, y , c= kmeans.labels_, alpha=0.7) plt.title("PCA: morgan_fps, cluster") plt.colorbar() # logP에서 색으로 구분 plt.subplot(1,2,2) plt.scatter(x, y, c= df.exp, alpha=0.7, cmap='spring') plt.title("PCA: morgan_fps, logP") plt.colorbar()

RDkit 지문으로 화합물 공간을 시각화 한 결과.

마찬가지로 df_morgan_fps 부분을 df_rdkit_fps로 바꾸고 RDkit 지문으로 시각화해 보겠습니다.어쨌든 RDkit 지문이 깨끗하게 투영되는 인상 ↓

# RDkit 지문을 UMAP × Spectral Clustering으로 시각화 sc = SpectralClustering(n_clusters=50, affinity= 'nearest_neighbors', n_jobs =-1) sc.fit(df_rdkit_fps) embedding = umap.UM 50, min_dist=2).fit_transform(df_rdkit_fps) x = embedding[:,0.5] y = embedding[:,0] fig = plt.figure(figsize=(1)) plt.subplot(15,5) ) plt.scatter(x, y, c= sc.labels_, alpha=1,2,1) plt.title("rdkit_fps, SpectralCluster") plt.colorbar() plt.subplot(0.7) plt.scatter(x, y, c= df.exp, alpha=1,2,2, cmap='spring') plt.title("rdkit_fps, logP") plt.colorbar()

「UMAP × Spectral Clustering」은 「PCA × kmeans」보다도 비슷한 화합물끼리 밀집하고 있다고 생각하지만, 따로 어느 쪽이라도 좋은 느낌.

logP에 대해서는, 모두 평면상의 위치와 물성치의 관련이 미묘하네요.보다 잘 화합물의 물성·활성치와 상관해 2차원 공간에 플롯하려면 autoencoder라든지 교사 있어 학습이 좋을 것 같기 때문에, 그중 시험해 보고 싶습니다.