Visualisieren Sie den zusammengesetzten Raum durch Dimensionsreduktion von Fingeprint

2019/10/26

Lassen Sie uns den zusammengesetzten Raum (chemischen Raum) basierend auf der chemischen Struktur anhand des öffentlich zugänglichen zusammengesetzten Datensatzes visualisieren.

Motivation

Visualisierung des zusammengesetzten Raums
- Gibt es eindeutige Verbindungen im Datensatz?
・ Welche Art von Verbindung ist enthalten und wie viel
Es wird Ihnen helfen, zu verstehen. Wenn Sie Vorhersagemodelle für QSAR und maschinelles Lernen erstellen, können Sie grob feststellen, ob Ihre Daten extrapoliert sind.

方法

Fingerabdruckberechnung

Durch Generieren eines Fingerabdrucks für jede Verbindung und Reduzieren der Abmessung ist es möglich, in einer Ebene zu zeichnen. Nach dem Prinzip ähnlicher Eigenschaften von Johnson und Maggiora sollten "ähnliche Verbindungen ähnliche Eigenschaften haben", Verbindungen mit ähnlichen Strukturen und Eigenschaften in einer Ebene nahe beieinander verteilt sein.

Probieren Sie für den zur Visualisierung verwendeten Fingerabdruck den Morgan-Fingerabdruck und den RDkit-Fingerabdruck aus.

Referenz: Fingerabdruck in RDkit verfügbar

Methode zur Reduzierung der Dimensionalität

Verwenden Sie zur Reduzierung der Dimensionalität die Hauptkomponentenanalyse (PCA) und UMAP. PCA wird am häufigsten verwendet, wird jedoch basierend auf der Linearität der Daten in einen Raum mit niedrigeren Dimensionen komprimiert, sodass es möglicherweise nicht für 0-1-Daten wie Fingerabdrücke geeignet ist.
Andererseits ist UMAP eine der Dimensionsreduktionsmethoden, die nichtlineare Komponenten berücksichtigen.Die Dimensionsreduzierung wie das Standard-t-SNE derselben Methode kann um ein Vielfaches schneller durchgeführt werden, sodass sie für große Datenmengen verwendet werden kann.

Verwenden Sie die kmeans-Methode und Spectral Clustering für das Clustering.
Die kmeans-Methode gruppiert sich durch Wiederholen einer Reihe von Operationen: (XNUMX) zufälliges Setzen von Clustern, (XNUMX) Hinzufügen von Datenpunkten in der Nähe, um die Position des Schwerpunkts zu aktualisieren, und (XNUMX) erneutes Finden des Schwerpunkts mit den aktualisierten Daten in der Nähe der Schwerpunkt. Es ist bekannt, dass nichtlineare Daten wie Moon und Swiss Roll nicht gut klassifiziert werden können, aber Spectral Clustering scheint in der Lage zu sein, mit solchen Daten umzugehen. Sogar das Spickzettel zum Scikit-Lernen ist eine Option, wenn die kmeans-Methode nicht funktioniert.

Ich möchte jedes von ihnen mit der "PCA x kmeans-Methode" kombinieren, die Normalverteilung und lineare Daten voraussetzt, und dem "UMAP x Spectral Clustering", das nichtlineare Daten unterstützt.

Übrigens gibt es auch eine Methode zur Clusterbildung von Verbindungen basierend auf dem Tanimoto-Koeffizienten (die Ähnlichkeit zwischen zwei Verbindungen wird von 2 bis 0 ausgedrückt. Die gleiche Struktur wie 1), die jedoch häufig als Ähnlichkeitsindex von Verbindungen verwendet wird, aber diesmal habe ich es versucht. Ist nicht ...

Referenz: Dimensionsreduktion und 2D-Plotting-Techniken für hochdimensionale Daten
   Spektrales Clustering (Clusteranalyse)

Lassen Sie uns den zusammengesetzten Raum visualisieren

Verwenden Sie die Lipophilie von Molecule net für den Datensatz.Ungefähr 4200 Verbindungen enthalten ihre jeweiligen SMILES und experimentellen logP (Hydrophobizitätsindex: Octanol / Wasser-Verteilungskoeffizient).

Referenz:Liste der zusammengesetzten Datensätze

# Paketimport Pandas als pd importieren numpy als np von sklearn.cluster importieren KMeans von sklearn.decomposition importieren PCA von sklearn.cluster importieren SpectralClustering importieren umap von rdkit importieren Chem von rdkit.Chem importieren AllChem importieren matplotlib.pyplot als plt% matplotlib inline # Datensatz lesen df = pd.read_csv ('Lipophilicity.csv') print (df.info ()) df.head (5)


RangeIndex: 4200 Einträge, 0 bis 4199
Datenspalten (insgesamt 3 Spalten):
CMPD_CHEMBLID 4200 Nicht-Null-Objekt
exp 4200 nicht null float64
lächelt 4200 Nicht-Null-Objekt
dtypes: float64 (1), Objekt (2) Speichernutzung: 98.5+ KB Keine

logP-Datensatz

 

#Morgan und RDkit erhalten Fingerabdruck mols = [Chem.MolFromSmiles (x) für x in df.smiles] morgan_fps = [AllChem.GetMorganFingerprintAsBitVect (x, 2, 1024) für x in mols] rdkit_fps = [Chem.RDKFingerprint (x, fpSize = 1024) für x in mols] # Fingerabdruck in DF speichern df_morgan_fps = pd.DataFrame (np.array (morgan_fps)) df_rdkit_fps = pd.DataFrame (np.array (rdkit_fps))

Der Morgan-Fingerabdruck zählt die Unterstrukturen innerhalb eines festgelegten Radius von einem Atom. Ein Algorithmus ähnlich dem ECFP-Fingerabdruck (Extended Connectivity Fingerprint), bei dem Morgans Radius 2 ECFP4 entspricht.Hier berechnen wir den Fingerabdruck des Radius = 2 Bit.
Der RDkit-Fingerabdruck zählt Teilstrukturen basierend auf der Bindungslänge und nicht auf dem Radius vom Atom.Dies ähnelt dem Daylight-Fingerabdruck.Standardmäßig wird die minimale Pfadlänge: 1 Join - maximale Pfadlänge: 7 Joins berücksichtigt.

Der erhaltene Fingerabdruck istDa die nachfolgende Verarbeitung nicht wie bei einem Objekt wie ausgeführt werden kann, korrigieren Sie sie in einem Datenrahmen.
 

# kmeans clustering kmeans = KMeans (n_clusters = 8, n_jobs = -1) kmeans.fit (df_morgan_fps) # Dimensionsreduktion mit PCA pca = PCA (n_components = 2) decomp = pca.fit_transform (df_morgan_fps) x = decomp [:, 0 ] y = decomp [:, 1] #Visualization plt.figure (figsize = (15,5)) # Farbcodierte Cluster, die durch kmeans plt.subplot (1,2,1) plt.scatter (x, y) erhalten wurden, c = kmeans.labels_, alpha = 0.7) plt.title ("PCA: morgan_fps, cluster") plt.colorbar () # farbcodiert mit 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 ()

Das Ergebnis der Visualisierung des zusammengesetzten Raums mit dem RDkit-Fingerabdruck.

Ändern Sie in ähnlicher Weise den Teil df_morgan_fps in df_rdkit_fps und visualisieren Sie ihn mit dem RDkit-Fingerabdruck.Irgendwie der Eindruck, dass der RDkit-Fingerabdruck schöner projiziert wird ↓

# Mit "UMAP x Spectral Clustering" visualisierte RDkit-Fingerabdrücke sc = SpectralClustering (n_clusters = 50, Affinität = 'next_neighbors', n_jobs = -1) min_dist = 50) .fit_transform (df_rdkit_fps) x = Einbettung [:, 2] y = Einbettung [:, 0.5] fig = plt.figure (figsize = (0)) plt.subplot (1)) plt.scatter (x, y, c = sc.labels_, alpha = 15,5) plt.title ("rdkit_fps, SpectralCluster") plt.colorbar () plt.subplot (1,2,1) plt.scatter (x, y , c = df.exp, alpha = 0.7, cmap = 'spring') plt.title ("rdkit_fps, logP") plt.colorbar ()

Ich bin der Meinung, dass "UMAP x Spectral Clustering" dichter mit ähnlichen Verbindungen gefüllt ist als "PCA x kmeans", aber beide sind in Ordnung.

In Bezug auf logP ist die Beziehung zwischen der Position in der Ebene und dem Wert der physikalischen Eigenschaft schwierig.Autoencoder oder überwachtes Lernen scheinen besser für das Zeichnen in einem zweidimensionalen Raum in Korrelation mit den physikalischen Eigenschaften und Aktivitätswerten von Verbindungen zu sein, daher würde ich es gerne bald versuchen.