[PYTHON] Was ist Ihr "Tanimoto-Koeffizient"?

Ein bekannter Index, wenn es um die Ähnlichkeit von Verbindungen geht, ist der "Tanimoto-Koeffizient". Es gibt jedoch einige Leute, die nur "Tanimoto-Koeffizient" sagen, und es gibt einige Möglichkeiten, sich über "Ist das nicht genug zu erklären?"

Verwenden Sie beispielsweise den folgenden zusammengesetzten Satz

Die Anzahl der Verbindungen beträgt 10.

smiles = [
    'C1=CC=C2C3CC(CNC3)CN2C1=O',
    'CN1c2c(C(N(C)C1=O)=O)[nH0](CC(CO)O)c[nH0]2',
    'CN1C2CC(CC1C1C2O1)OC(C(c1ccccc1)CO)=O',
    'CN1C2CC(CC1C1C2O1)OC(C(c1cccnc1)CO)=O', #Ähnlich der obigen Verbindung
    'CN(C=1C(=O)N(c2ccccc2)N(C1C)C)C',
    'CN(C=1C(=O)N(C2CCCCC2)N(C1C)C)C', #Ähnlich der obigen Verbindung
    'OCC1C(C(C(C(OCC2C(C(C(C(OC(c3ccccc3)C#N)O2)O)O)O)O1)O)O)O',
    'OCc1ccccc1OC1C(C(C(C(CO)O1)O)O)O',
    'OCc1cc(N)ccc1OC1C(C(C(C(CO)O1)O)O)O', #Ähnlich der obigen Verbindung
    '[nH0]1c(OC)c2c([nH0]cc[nH0]2)[nH0]c1',
]

Generieren von Verbindungen mit RDKit aus der SMILES-Notation

from rdkit import Chem

mols = [Chem.MolFromSmiles(smile) for smile in smiles]

Generieren Sie (eine Art) Morgan-Fingerabdruck

from rdkit.Chem import AllChem

fps = [AllChem.GetMorganFingerprint(mol, 3, useFeatures=True) for mol in mols]

Berechnen Sie den Tanimoto-Koeffizienten

from rdkit import DataStructs

sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]

Verteilung des Tanimoto-Koeffizienten

Auf diese Weise können Sie die Verteilung des Tanimoto-Koeffizienten sehen. Es scheint, dass das mit dem Tanimoto-Koeffizienten = 1 dasselbe Molekül ist, aber es gibt andere Molekülpaare mit einem höheren Tanimoto-Koeffizienten. Finden Sie heraus (oder stellen Sie sich vor), was es ist

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()

output_9_0.png

Und es gibt verschiedene Dinge in Morgan Fingerabdruck

Der Morgan-Fingerabdruck hat auch verschiedene Parameter, und wenn Sie diese ändern, ändert sich auch der Wert des Tanimoto-Koeffizienten.

fps = [AllChem.GetMorganFingerprint(mol, 2, useFeatures=True) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()

output_11_0.png

fps = [AllChem.GetMorganFingerprint(mol, 1, useFeatures=True) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()

output_12_0.png

fps = [AllChem.GetMorganFingerprintAsBitVect(mol, 3, 1024) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()

output_13_0.png

fps = [AllChem.GetMorganFingerprintAsBitVect(mol, 3, 2048) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()

output_14_0.png

Und es gibt noch andere Fingerabdrücke

Es gibt nur zwei, weil es schwierig ist, alles zu berechnen. Eines der wichtigen Dinge ist, dass in den folgenden Berechnungsergebnissen 10 oder mehr Fälle mit einem Tanimoto-Koeffizienten von 1,0 vorhanden sind. Mit anderen Worten, beachten Sie, dass der Tanimoto-Koeffizient 1,0 betragen kann, auch wenn es sich nicht um dasselbe Molekül handelt.

fps = [AllChem.GetMACCSKeysFingerprint(mol) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()

output_17_0.png

fps = [Chem.RDKFingerprint(mol) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()

output_18_0.png

Sie können den Tanimoto-Koeffizienten auch mit MCS definieren.

from rdkit.Chem import rdFMCS

matrix = []
for mol1 in mols:
    for mol2 in mols:
        mcs = rdFMCS.FindMCS([mol1, mol2])
        a1 = len(mol1.GetAtoms())
        a2 = len(mol2.GetAtoms())
        matrix.append(mcs.numAtoms / (a1 + a2 - mcs.numAtoms) )

plt.hist(np.array(matrix).flatten(), bins=20)
plt.grid()
plt.show()

output_20_0.png

MCS hat auch verschiedene Optionen

from rdkit.Chem import rdFMCS

matrix = []
for mol1 in mols:
    for mol2 in mols:
        mcs = rdFMCS.FindMCS([mol1, mol2], atomCompare=rdFMCS.AtomCompare.CompareAny)
        a1 = len(mol1.GetAtoms())
        a2 = len(mol2.GetAtoms())
        matrix.append(mcs.numAtoms / (a1 + a2 - mcs.numAtoms) )

plt.hist(np.array(matrix).flatten(), bins=20)
plt.grid()
plt.show()

output_22_0.png

from rdkit.Chem import rdFMCS

matrix = []
for mol1 in mols:
    for mol2 in mols:
        mcs = rdFMCS.FindMCS([mol1, mol2])
        a1 = len(mol1.GetBonds())
        a2 = len(mol2.GetBonds())
        matrix.append(mcs.numBonds / (a1 + a2 - mcs.numBonds) )

plt.hist(np.array(matrix).flatten(), bins=20)
plt.grid()
plt.show()

output_23_0.png

from rdkit.Chem import rdFMCS

matrix = []
for mol1 in mols:
    for mol2 in mols:
        mcs = rdFMCS.FindMCS([mol1, mol2], bondCompare=rdFMCS.BondCompare.CompareOrderExact)
        a1 = len(mol1.GetBonds())
        a2 = len(mol2.GetBonds())
        matrix.append(mcs.numBonds / (a1 + a2 - mcs.numBonds) )

plt.hist(np.array(matrix).flatten(), bins=20)
plt.grid()
plt.show()

output_24_0.png

Was ist Ihr "Tanimoto-Koeffizient"?

Recommended Posts

Was ist Ihr "Tanimoto-Koeffizient"?
Was ist ein Namespace?
Was ist copy.copy ()
Was ist Django? .. ..
Was ist dotenv?
Was ist POSIX?
Was ist Linux?
Was ist SALOME?
Was ist Python?
Was ist Hyperopt?
Was ist Linux?
Was ist Pyvenv?
Was ist Python?
Was ist eine Distribution?
Was ist Piotroskis F-Score?
Was ist Raspberry Pi?
[Python] Was ist Pipeline ...
Was ist das Calmar-Verhältnis?
Was ist Hyperparameter-Tuning?
Was ist ein Hacker?
Wofür ist Linux?
Was ist Ensemble-Lernen?
Was ist Pythons __init__.py?
Was ist ein Iterator?
Was ist UNIT-V Linux?
[Python] Was ist virtualenv?
Was ist maschinelles Lernen?
Was ist Mini Sam oder Mini Max?
Ihr Threading.Event wird falsch verwendet
Was ist eine logistische Regressionsanalyse?
Was ist ein Entscheidungsbaum?
Was ist ein Kontextwechsel?
Was ist Google Cloud Dataflow?
[DL] Was ist Gewichtsverlust?
Was ist ein Superuser?
Wettbewerbsprogrammierung ist was (Bonus)
[Python] * args ** Was ist kwrgs?
Was ist ein Systemaufruf?
[Definition] Was ist ein Framework?
Was ist die Schnittstelle für ...
Was ist Project Euler 3-Beschleunigung?
Was ist eine Rückruffunktion?
Was ist die Rückruffunktion?
Python-Grundkurs (1 Was ist Python?)
[Python] Was ist eine Zip-Funktion?
[Python] Was ist eine with-Anweisung?
Was ist Kennzeichnung in der Finanzprognose?
Was ist Azure Automation Update Management?
[Python] Was ist @? (Über Dekorateure)
Was ist ein lexikalischer / dynamischer Bereich?
Was ist das Convolutional Neural Network?
Was ist statistische Modellierung?
Was ist Schaben? [Zusammenfassung für Anfänger]
Was für ein Kernel ist dieser Kernel?
Python für Anweisung ~ Was ist iterierbar ~
Was ist das X Window System?
Wofür ist der Python-Unterstrich (_)?