Visualiseer samengestelde ruimte door dimensionaliteitsreductie van Fingeprint

2019 年 10 月 26 日

Laten we de samengestelde ruimte (chemische ruimte) visualiseren op basis van de chemische structuur met behulp van de samengestelde dataset die open is voor het publiek.

Motivatie

Visualisatie van samengestelde ruimte
-Zijn er unieke verbindingen in de dataset?
・ Wat voor soort stof zit er in en hoeveel
Het zal je helpen het te begrijpen. Bij het maken van voorspellende modellen voor QSAR en machine learning, kunt u grofweg bepalen of uw gegevens extrapolaties hebben.

Methode

Vingerafdruk berekening

Door voor elke verbinding een vingerafdruk te genereren en de dimensie te verkleinen, is het mogelijk om op een vlak te plotten. Volgens het principe van vergelijkbare eigenschappen van Johnson en Maggiora, "Vergelijkbare verbindingen hebben vergelijkbare eigenschappen", moeten verbindingen met vergelijkbare structuren en eigenschappen dicht bij elkaar in een vlak worden verdeeld.

Probeer voor de vingerafdruk die voor visualisatie wordt gebruikt de Morgan-vingerafdruk en de RDkit-vingerafdruk.

Referentie: Vingerafdruk beschikbaar in RDkit

Dimensionaliteitsreductiemethode

Voor het verminderen van dimensionaliteit, probeer Principal Component Analysis (PCA) en UMAP te gebruiken. PCA wordt het meest gebruikt, maar wordt gecomprimeerd tot een lagere dimensionale ruimte op basis van de lineariteit van de gegevens, dus het is mogelijk niet geschikt voor 0-1 gegevens zoals vingerafdrukken.
Aan de andere kant is UMAP een van de dimensiereductiemethoden waarbij rekening wordt gehouden met niet-lineaire componenten.Dimensionaliteitsreductie zoals de standaard t-SNE van dezelfde methode kan meerdere keren sneller worden voltooid, dus het kan worden gebruikt voor grote gegevenssets.

Gebruik de kmeans-methode en Spectral Clustering voor clustering.
De kmeans-methode clustert door een reeks bewerkingen te herhalen: (XNUMX) het willekeurig instellen van clusters, (XNUMX) het toevoegen van nabijgelegen datapunten om de positie van het zwaartepunt bij te werken, en (XNUMX) het vinden van het zwaartepunt opnieuw met de bijgewerkte gegevens in de buurt van het zwaartepunt. Het is bekend dat niet-lineaire data zoals Moon en Swiss roll niet goed geclassificeerd kunnen worden, maar Spectral Clustering lijkt met dergelijke data om te kunnen gaan. Zelfs de scikit learn cheat sheet is een optie als de kmeans-methode niet werkt.

Ik zou ze allemaal willen combineren met de "PCA x kmeans-methode" die uitgaat van normale distributie en lineaire gegevens en de "UMAP x Spectral Clustering" die niet-lineaire gegevens ondersteunt.

Overigens is er ook een methode om verbindingen te clusteren op basis van de tanimoto-coëfficiënt (de overeenkomst tussen twee verbindingen wordt uitgedrukt van 2 tot 0. Dezelfde structuur als 1), die vaak wordt gebruikt als een index van gelijkenis van verbindingen, maar deze keer heb ik het geprobeerd. Is niet ...

Referentie: Dimensionaliteitsreductie en 2D-plottechnieken voor hoogdimensionale gegevens
   Spectrale clustering (clusteranalyse)

Laten we de samengestelde ruimte visualiseren

Gebruik Lipophilicity van Molecule net voor de dataset.Ongeveer 4200 verbindingen bevatten hun respectievelijke SMILES en experimentele logP (hydrofobiciteitsindex: octanol / waterverdelingscoëfficiënt).

Zie ook:Lijst met samengestelde datasets

# pakket import panda's importeren als pd import numpy als np uit sklearn.cluster importeer KMeans uit sklearn.decomposition importeer PCA uit sklearn.cluster import SpectralClustering importeer umap uit rdkit importeer Chem uit rdkit.Chem importeer AllChem importeer matplotlib.pyplot als plt% matplotlib inline # read dataset df = pd.read_csv ('Lipophilicity.csv') print (df.info ()) df.head (5)


RangeIndex: 4200 vermeldingen, 0 tot 4199
Gegevenskolommen (totaal 3 kolommen):
CMPD_CHEMBLID 4200 niet-null-object
exp 4200 niet-null float64
lacht 4200 niet-nulobject
dtypes: float64 (1), object (2) geheugengebruik: 98.5+ KB Geen

logP-gegevensset

 

#Morgan en RDkit krijgen vingerafdruk mols = [Chem.MolFromSmiles (x) voor x in df.smiles] morgan_fps = [AllChem.GetMorganFingerprintAsBitVect (x, 2, 1024) voor x in mol] rdkit_fps = [Chem.RDKFingerprint (x, fpSize = 1024) voor x in mol] #store-vingerafdruk in DF df_morgan_fps = pd.DataFrame (np.array (morgan_fps)) df_rdkit_fps = pd.DataFrame (np.array (rdkit_fps))

De Morgan-vingerafdruk telt substructuren binnen een ingestelde straal vanaf een atoom. Een algoritme vergelijkbaar met de ECFP-vingerafdruk (Extended Connectivity Fingerprint), waarbij Morgan's straal 2 overeenkomt met ECFP4.Hier berekenen we de vingerafdruk met straal = 2 bits.
De RDkit-vingerafdruk telt gedeeltelijke structuren op basis van bindingslengte in plaats van straal vanaf het atoom.Dit is vergelijkbaar met de Daylight-vingerafdruk.Standaard wordt de minimale padlengte: 1 join - maximale padlengte: 7 joins in aanmerking genomen.

De verkregen vingerafdruk isAangezien de daaropvolgende verwerking niet kan worden uitgevoerd zoals het is met een object zoals, corrigeert u deze naar een dataframe.
 

# kmeans clustering kmeans = KMeans (n_clusters = 8, n_jobs = -1) kmeans.fit (df_morgan_fps) # Dimensiereductie met PCA pca = PCA (n_components = 2) decomp = pca.fit_transform (df_morgan_fps) x = decomp [:, 0 ] y = decomp [:, 1] #Visualisatie plt.figure (figsize = (15,5)) # Kleurgecodeerde clusters verkregen door kmeans plt.subplot (1,2,1) plt.scatter (x, y), c = kmeans.labels_, alpha = 0.7) plt.title ("PCA: morgan_fps, cluster") plt.colorbar () # kleur gecodeerd met 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 ()

Het resultaat van het visualiseren van de samengestelde ruimte met de RDkit-vingerafdruk.

Verander op dezelfde manier het deel df_morgan_fps in df_rdkit_fps en visualiseer het met de RDkit-vingerafdruk.Op de een of andere manier de indruk dat de RDkit-vingerafdruk mooier wordt geprojecteerd ↓

# RDkit-vingerafdrukken gevisualiseerd met "UMAP x Spectral Clustering" sc = SpectralClustering (n_clusters = 50, affinity = 'dichtstbijzijnde_buren', n_jobs = -1) sc.fit (df_rdkit_fps) embedding = umap.UMAP (n_neighbours = 50, n_components = 2, min_dist = 0.5) .fit_transform (df_rdkit_fps) x = embedding [:, 0] y = embedding [:, 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 = 'spring') plt.title ("rdkit_fps, logP") plt.colorbar ()

Ik heb het gevoel dat "UMAP x Spectral Clustering" dichter is verpakt met vergelijkbare verbindingen dan "PCA x kmeans", maar beide zijn prima.

Met betrekking tot logP is de relatie tussen de positie op het vliegtuig en de fysieke eigendomswaarde delicaat.Autoencoder of begeleid leren lijkt beter te zijn voor het plotten in een tweedimensionale ruimte in samenhang met de fysieke eigenschappen en activiteitswaarden van verbindingen, dus ik zou het binnenkort willen proberen.