Esrar Makine Öğrenimi Bölüm 1 İçin Evrişimli Bir Sinir Ağı Tasarlamak
Evrişimli Sinir Ağlarını tasarlamak için güzel ve parlak bir Pazar sabahı. Bir CNN, görüntüleri kullanma konusunda eğitilmiş ve özellikleri belirlemek için bir dizi filtreden geçen bir sinir ağıdır. Bir organik kimyager olarak, yapıları tasarlamak için gözlerimizi kullanırız, bu yüzden belki de bu sezgisel bir makine öğrenimi yaklaşımıdır ve kendi dahili filtrelerimizi kullanarak bir molekülü parçalar. Denemek doğal görünüyor.

Bu ağ için amacımız, bir molekülün, THC için temel bir hedef olan ortak bir endokannabinoid reseptörü olan CB1'e bağlanma sabitine (bir ligandın ne kadar güçlü bağlandığına) bağlı olarak esrar gibi davranıp davranmayacağını bilmek istiyoruz. Kristal yapı, Hua ve diğ.
Yapı, bağlama cebi reseptörün içinde çok derinde olan, ayakkabı tipi bir şekle sahip bir dizi alfa helistir.

Bir CB1 reseptörüne THC'nin miktarı, bir inhibitörün ne kadar güçlü olduğunun bir göstergesi olan bir inhibisyon sabiti Ki ile ölçülebilir. 100 mikro moların küçük Ki değerlerinin güçlü olduğu kabul edilir.
Bu belgeden nM cinsinden kaydedildiği şekliyle CB1 inhibitörlerinin bir listesini ve bunların inhibisyon sabitlerini alırsak:
Yeni bir kannabinoid bileşiğinin, inhibisyon sabit değerine dayanarak THC gibi bir terpen gibi davranıp davranmayacağını tahmin edebilir miyiz? İşte makaleden çıkarılan bazı veriler. Daha fazlasını almaktan çekinmeyin.
compounds = {
'CCCCC1=CC(=C2C3C=C(CCC3C(OC2=C1)(C)C)C)O': 36,
'CCCC1=CC(=C2C3C=C(CCC3C(OC2=C1)(C)C)C)O': 22,
'CCCCCC1=CC2=C(C3C=C(CCC3C(O2)(C)C)C)C(=C1C(=O)O)O': 620,
'CCCCCC1=CC(=C(C(=C1)O)C/C=C(\C)/CCC=C(C)C)O': 1045,
'CCCC1=CC(=C(C(=C1)O)C/C=C(\C)/CCC=C(C)C)O': 2865,
'CCCCCC1=CC(=C(C(=C1C(=O)O)O)C/C=C(\C)/CCC=C(C)C)O': 13116,
'COC1=C(C/C=C(CC/C=C(C)\C)\C)C(O)=CC(CCCCC)=C1': 10000,
'CCCCCC1=CC(=C(C(=C1)O)C2C=C(CCC2C(=C)C)C)O': 1690,
'CCCC1=CC(=C(C(=C1)O)C2C=C(CCC2C(=C)C)C)O': 14445,
'CCCCCC1=CC(=C(C(=C1C(=O)O)O)C2C=C(CCC2C(=C)C)C)O': 626,
}

Gelelim ithalatımıza:
import rdkit
import numpy as np
import pandas as pd
from rdkit import Chem
from rdkit.Chem import AllChem
from matplotlib import pyplot as plt
df = pd.DataFrame()
df['smiles'] = list(compounds.keys())
df['ki'] = list(compounds.values())
df["mol"] = df["smiles"].apply(Chem.MolFromSmiles)

Bir çözünürlüğün görüntü üzerindeki etkisi, farklı bilgilerin kapladığı alanın hakim olabileceği yer olabilir.

Görüntünüzün gömülmesi ve çözünürlüğü çok önemlidir çünkü sinir ağının özellikleri daha verimli bir şekilde soyutlamasına izin verir. Bu yüzden boyutları ve 2B koordinatları hesaplıyoruz ve atom numarası gibi bilgiler için bir meta depo görevi görecek 4 boş sıfır ayarlıyoruz.
def chemcepterize_mol(mol, embed=10.0, res=0.2):
dimensions = int(embed*2/res)
chempcepterized_molecule = Chem.Mol(mol.ToBinary())
chempcepterized_molecule.ComputeGasteigerCharges()
AllChem.Compute2DCoords(chempcepterized_molecule)
coords = chempcepterized_molecule.GetConformer(0).GetPositions()
vector = np.zeros((dims,dims,4))
[[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]
...
[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]
...
[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]
...
[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
for i,bond in enumerate(mol.GetBonds()):
bond_order = bond.GetBondTypeAsDouble()
start_atom_index = bond.GetBeginAtomIdx()
end_atom_index = bond.GetEndAtomIdx()
start_coordinates = coords[start_atom_index]
end_coordinates = coords[end_atom_index]
fractional_space = np.linspace(0,1,int(1/res*2))
for fraction in fractional_space:
coordinates = (fraction*start_coordinates + (1-fraction)*end_coordinates)
x = int(round((coordinates[0] + embed)/res))
y = int(round((coordinates[1]+ embed)/res))
vector[ x, y, 0] = bond_order
for i,atom in enumerate(cmol.GetAtoms()):
x = int(round((coords[i][0] + embed)/res))
y = int(round((coords[i][1]+ embed)/res))
vector[ x , y, 1] = atom.GetAtomicNum()
hyptype = atom.GetHybridization().real
vector[ x , y, 2] = hyptype
charge = atom.GetProp("_GasteigerCharge")
vector[ x , y, 3] = charge
return vect
def chemcepterize_mol(mol, embed=10.0, res=0.2):
dimensions = int(embed*2/res)
chempcepterized_molecule = Chem.Mol(mol.ToBinary())
chempcepterized_molecule.ComputeGasteigerCharges()
AllChem.Compute2DCoords(chempcepterized_molecule)
coords = chempcepterized_molecule.GetConformer(0).GetPositions()
vector = np.zeros((dims,dims,4))
# Bonds
for i,bond in enumerate(mol.GetBonds()):
bond_order = bond.GetBondTypeAsDouble()
start_atom_index = bond.GetBeginAtomIdx()
end_atom_index = bond.GetEndAtomIdx()
start_coordinates = coords[start_atom_index]
end_coordinates = coords[end_atom_index]
# Draw Bond A long Vector
fractional_space = np.linspace(0,1,int(1/res*2))
for fraction in fractional_space:
coordinates = (fraction*start_coordinates + (1-fraction)*end_coordinates)
x = int(round((coordinates[0] + embed)/res))
y = int(round((coordinates[1]+ embed)/res))
vector[ x, y, 0] = bond_order
# Atoms
for i,atom in enumerate(cmol.GetAtoms()):
x = int(round((coords[i][0] + embed)/res))
y = int(round((coords[i][1]+ embed)/res))
vector[ x , y, 1] = atom.GetAtomicNum()
hyptype = atom.GetHybridization().real
vector[ x , y, 2] = hyptype
charge = atom.GetProp("_GasteigerCharge")
vector[ x , y, 3] = charge
return vect
def vectorize(mol):
return chemcepterize_mol(mol, embed=12)
df["mol_image"] = df["mol"].apply(vectorize)