Esrar Makine Öğrenimi Bölüm 1 İçin Evrişimli Bir Sinir Ağı Tasarlamak

May 01 2023
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.

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)