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?"
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',
]
from rdkit import Chem
mols = [Chem.MolFromSmiles(smile) for smile in smiles]
from rdkit.Chem import AllChem
fps = [AllChem.GetMorganFingerprint(mol, 3, useFeatures=True) for mol in mols]
from rdkit import DataStructs
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
Recommended Posts