Visualisez l'espace composé par réduction de la dimensionnalité de Fingeprint

2019er mars 10

Visualisons l'espace composé (espace chimique) en fonction de la structure chimique à l'aide de l'ensemble de données composé ouvert au public.

Motivation

Visualisation de l'espace composé
-Y a-t-il des composés uniques dans l'ensemble de données?
・ Quel type de composé est contenu et combien
Cela vous aidera à comprendre. Lors de la création de modèles prédictifs pour QSAR et l'apprentissage automatique, vous pouvez déterminer approximativement si vos données ont des extrapolations.

方法

Calcul d'empreintes digitales

En générant une empreinte digitale pour chaque composé et en réduisant la dimension, il est possible de tracer sur un plan. Selon le principe des propriétés similaires de Johnson et Maggiora, «Les composés similaires ont des propriétés similaires», les composés ayant des structures et des propriétés similaires doivent être répartis à proximité les uns des autres sur un plan.

Pour l'empreinte digitale utilisée pour la visualisation, essayez l'empreinte digitale Morgan et l'empreinte digitale RDkit.

Référence : Empreinte digitale disponible dans RDkit

Méthode de réduction de dimensionnalité

Pour réduire la dimensionnalité, essayez d'utiliser l'analyse en composantes principales (ACP) et UMAP. Le PCA est le plus couramment utilisé, mais il se compresse dans un espace dimensionnel inférieur en fonction de la linéarité des données, il peut donc ne pas convenir aux données 0-1 telles que les empreintes digitales.
D'autre part, UMAP est l'une des méthodes de réduction de dimension prenant en compte les composants non linéaires.Il peut être utilisé pour de grands ensembles de données car il peut effectuer une réduction de dimension plusieurs fois plus rapidement que le t-SNE standard de la même méthode.

Utilisez la méthode kmeans et le clustering spectral pour le clustering.
La méthode kmeans regroupe en répétant une série d'opérations: (XNUMX) définir aléatoirement des clusters, (XNUMX) ajouter des points de données à proximité pour mettre à jour la position du centre de gravité, et (XNUMX) retrouver le centre de gravité avec les données mises à jour près de le centre de gravité. On sait que les données non linéaires telles que la Lune et le rouleau suisse ne peuvent pas être bien classées, mais le clustering spectral semble être capable de gérer de telles données. Même la feuille de triche scikit learn est une option si la méthode kmeans ne fonctionne pas.

Je voudrais combiner chacun d'eux avec la "méthode PCA x kmeans" qui suppose une distribution normale et des données linéaires et le "UMAP x Spectral Clustering" qui prend en charge les données non linéaires.

À propos, il existe également une méthode de regroupement des composés basée sur le coefficient de tanimoto (la similitude entre deux composés est exprimée de 2 à 0. La même structure que 1), qui est souvent utilisée comme indice de similitude des composés, mais cette fois je l'ai essayé. N'est-ce pas ...

Référence : Réduction de la dimensionnalité et techniques de traçage 2D pour les données de grande dimension
   Clustering spectral (analyse de cluster)

Visualisons l'espace composé

Utilisez la lipophilicité de Molecule net pour l'ensemble de données.Environ 4200 composés contiennent leurs SMILES respectifs et leur logP expérimental (indice d'hydrophobicité: coefficient de partage octanol / eau).

Référence:Liste des jeux de données composés

# 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 AllChem import matplotlib.pyplot as plt% matplotlib inline # read dataset df = pd.read_csv ('Lipophilicity.csv') print (df.info ()) df.head (5)


RangeIndex: 4200 entrées, 0 à 4199
Colonnes de données (3 colonnes au total):
CMPD_CHEMBLID 4200 objet non nul
exp 4200 float64 non nul
smiles 4200 objet non nul
dtypes: float64 (1), utilisation de la mémoire de l'objet (2): 98.5+ Ko Aucun

ensemble de données logP

 

#Morgan and RDkit Get Fingerprint mols = [Chem.MolFromSmiles (x) for x in df.smiles] morgan_fps = [AllChem.GetMorganFingerprintAsBitVect (x, 2, 1024) for x in mols] rdkit_fps = [Chem.RDKFingerprint (x, fpSize) = 1024) pour x en mols] #store empreinte digitale dans DF df_morgan_fps = pd.DataFrame (np.array (morgan_fps)) df_rdkit_fps = pd.DataFrame (np.array (rdkit_fps))

L'empreinte digitale Morgan compte les sous-structures dans un rayon défini à partir d'un atome. Un algorithme similaire à l'empreinte digitale ECFP (Extended Connectivity Fingerprint), où le rayon 2 de Morgan correspond à ECFP4.Ici, nous calculons l'empreinte digitale de rayon = 2 bits.
L'empreinte digitale RDkit compte les structures partielles en fonction de la longueur de la liaison plutôt que du rayon de l'atome.Ceci est similaire à l'empreinte digitale Daylight.Par défaut, longueur minimale du chemin: 1 jointure - longueur maximale du chemin: 7 jointures sont prises en compte.

L'empreinte digitale obtenue estPuisque le traitement suivant ne peut pas être effectué tel quel avec un objet comme, corrigez-le en un bloc de données.
 

# kmeans clustering kmeans = KMeans (n_clusters = 8, n_jobs = -1) kmeans.fit (df_morgan_fps) # Réduction de dimension avec PCA pca = PCA (n_components = 2) decomp = pca.fit_transform (df_morgan_fps) x = decomp [:, 0 ] y = decomp [:, 1] # Visualisation plt.figure (figsize = (15,5)) # Clusters à code couleur obtenus par kmeans plt.subplot (1,2,1) plt.scatter (x, y), c = kmeans.labels_, alpha = 0.7) plt.title ("PCA: morgan_fps, cluster") plt.colorbar () # code couleur avec logP plt.subplot (1,2,2) plt.scatter (x, y, c = df.exp, alpha = 0.7, cmap = 'printemps') plt.title ("PCA: morgan_fps, logP") plt.colorbar ()

Le résultat de la visualisation de l'espace composé avec l'empreinte digitale RDkit.

De même, changez la partie df_morgan_fps en df_rdkit_fps et visualisez-la avec l'empreinte digitale RDkit.D'une manière ou d'une autre, l'impression que l'empreinte digitale RDkit est projetée plus magnifiquement ↓

# RDkit Fingerprints visualisés avec "UMAP x Spectral Clustering" sc = SpectralClustering (n_clusters = 50, affinity = 'plus proche_neighbours', n_jobs = -1) sc.fit (df_rdkit_fps) embedding = umap.UMAP (n_neighbors = 50, n_components = 2, min_dist = 0.5) .fit_transform (df_rdkit_fps) x = intégration [:, 0] y = intégration [:, 1] fig = plt.figure (figsize = (15,5)) plt.subplot (1,2,1)) plt.scatter (x, y, c = sc.labels_, alpha = 0.7) plt.title ("rdkit_fps, SpectralCluster") plt.colorbar () plt.subplot (1,2,2) plt.scatter (x, y , c = df.exp, alpha = 0.7, cmap = 'printemps') plt.title ("rdkit_fps, logP") plt.colorbar ()

Je pense que "UMAP x Spectral Clustering" est plus dense avec des composés similaires que "PCA x kmeans", mais l'un ou l'autre est très bien.

Concernant logP, la relation entre la position sur le plan et la valeur de la propriété physique est délicate.L'autoencoder ou l'apprentissage supervisé semble être meilleur pour tracer dans un espace bidimensionnel dans une meilleure corrélation avec les propriétés physiques et les valeurs d'activité d'un composé, j'aimerais donc l'essayer bientôt.