DeepChem教程7:深入了解分子特征化

DeepChem教程7:深入了解分子特征化

用分子数据进行机器学习的重要步骤是转换数据到适合机器学习算法的形式。这个过程广泛的称这“特征化”,包括转换分子到某种形式的矢量或张量。有不同的方法来完成,特征化的选择通常取决于要所解决的问题。我们已经看到过两种方法:分子指纹和用于图卷积的ConvMol对象。这个教程我们来看一下别的特征化。

Featurizers

在DeepChem中,分子(或其它输入)特征化的方法由特征化器对象定义。有三种使用特征化器的方法。

当使用MoleculeNet加载器函数时,你只是简单的传递使用的特征化方法名称。我们在之前的教程中已看到过例子,如featurizer='ECFP'或featurizer='GraphConv'。你也可以创建特征化器并直接应用到分子。如:

In [1]:

import deepchem as dc

featurizer = dc.feat.CircularFingerprint()

print(featurizer(['CC', 'CCC', 'CCO']))

[[0. 0. 0. ... 0. 0. 0.]

 [0. 0. 0. ... 0. 0. 0.]

 [0. 0. 0. ... 0. 0. 0.]]

当你用DataLoader框架创建新的数据集时,你可以指定Featurizer来处理数据。我们将在以后的教程中看到。我们用丙烷(CH3CH2CH3, SMILES字串表示为'CCC')为例运行本教程。

有许多特征化的方法使用分子的构像。构像可以由deepchem.utils.conformers 的ConformerGenerator类产生。

RDKitDescriptors

RDKitDescriptors通过RDKit计算描述符的值来特征化一个分子。有些基础的物理和化学特性:分子量、极化表面积、受体和配体的氢键数量等。这是对取决于这些高水平的特征进行预测非常重要的,而不是取决于分子的结构细节。

特征化器的本质是一系列描述符的设置,可以由RDKitDescriptors.allowedDescriptors来访问。特征化器使用rdkit.Chem.Descriptors.descList的描述符,检查是否存在描述符,并计算分子的描述符值。

我们来打印出丙烷的前10个描述符值。

In [2]:

rdkit_featurizer = dc.feat.RDKitDescriptors()

features = rdkit_featurizer(['CCC'])[0]

for feature, descriptor in zip(features[:10], rdkit_featurizer.descriptors):

    print(descriptor, feature)

MaxEStateIndex 2.125

MinEStateIndex 1.25

MaxAbsEStateIndex 2.125

MinAbsEStateIndex 1.25

qed 0.3854706587740357

MolWt 44.097

HeavyAtomMolWt 36.033

ExactMolWt 44.062600255999996

NumValenceElectrons 20.0

NumRadicalElectrons 0.0

当然,还有更多的描述符。

In [3]:

print('The number of descriptors present is: ', len(features))

The number of descriptors present is:  200

WeaveFeaturizer和MolGraphConvFeaturizer

我们前面看到过图卷积,使用ConvMolFeaturizer来转换分子到ConvMol对象。图卷积是用图表示分子的一个大的框架类的特例。它们工作相似但细节不同。例如,它们将数据向量与原子,与之相连的键,以及这两者相关。它们用多种技术来从前面的层计算新的数据向量并在最后一层用多种技术计算分子不平特征。

DeepChem基于不同的模型支持不同的图。其中一些需要略为不同的方法特征化分子。因此,有两种特征化器叫做WeaveFeaturizer 和 MolGraphConvFeaturizer。它们转换分子到不同的Python对象,被特定的模型使用。当使用基于图的模型时,需要看文档看来看你需要使用哪个特征化器。

CoulombMatrix

到目前为止我们看到的模型仅考虑分子的内在特性:组成分子的原子的列表和与原子要连的键。当处理灵活的分子时,你可能需要考虑不同的分子构像。例如,药物分子与蛋白质结合,结合的强度取决于原子对的具体的相互作用。要预测结合的强度,你可能需要考虑许多可能的构像并使用考虑构像的模型来进行预测。

Coulomb矩阵是一个流行的分子构像特征化方法。回顾一下两个电荷的静电的Coulomb相互作用与$q_1 q_2/r$成正比,其中$q_1$和$q_2$为电荷,$r$为它们的距离。对于有$N$原子的分子,Coulomb矩阵$N \times N$矩阵,每个元素都有一定的原子间相互作用强度。它包含原子的静电强度和距离信息。

    要使用这个特征化器,我们先要设置分子的构像。我们可以使用ConformerGenerator类来过多成。它使用RDKit分子,产生能量最小化构像,进行设置以提示它们之间的不同。我们来运行一下丙醇的例子。

In [4]:

from rdkit import Chem

generator = dc.utils.ConformerGenerator(max_conformers=5)

propane_mol = generator.generate_conformers(Chem.MolFromSmiles('CCC'))

print("Number of available conformers for propane: ", len(propane_mol.GetConformers()))

Number of available conformers for propane:  1

它只发现一个构像。这并不奇怪,因为丙醇是非常小的分子,几乎没有灵活性。我们来增加一个碳。

In [5]:

butane_mol = generator.generate_conformers(Chem.MolFromSmiles('CCCC'))

print("Number of available conformers for butane: ", len(butane_mol.GetConformers()))

Number of available conformers for butane:  3

现在我们为我们的分子创建Coulomb矩阵。

In [6]:

coulomb_mat = dc.feat.CoulombMatrix(max_atoms=20)

features = coulomb_mat(propane_mol)

print(features)

[[[36.8581052  12.48684429  7.5619687   2.85945193  2.85804514

    2.85804556  1.4674015   1.46740144  0.91279491  1.14239698

    1.14239675  0.          0.          0.          0.

    0.          0.          0.          0.          0.        ]

  [12.48684429 36.8581052  12.48684388  1.46551218  1.45850736

    1.45850732  2.85689525  2.85689538  1.4655122   1.4585072

    1.4585072   0.          0.          0.          0.

    0.          0.          0.          0.          0.        ]

  [ 7.5619687  12.48684388 36.8581052   0.9127949   1.14239695

    1.14239692  1.46740146  1.46740145  2.85945178  2.85804504

    2.85804493  0.          0.          0.          0.

    0.          0.          0.          0.          0.        ]

  [ 2.85945193  1.46551218  0.9127949   0.5         0.29325367

    0.29325369  0.21256978  0.21256978  0.12268391  0.13960187

    0.13960185  0.          0.          0.          0.

    0.          0.          0.          0.          0.        ]

  [ 2.85804514  1.45850736  1.14239695  0.29325367  0.5

    0.29200271  0.17113413  0.21092513  0.13960186  0.1680002

    0.20540029  0.          0.          0.          0.

    0.          0.          0.          0.          0.        ]

  [ 2.85804556  1.45850732  1.14239692  0.29325369  0.29200271

    0.5         0.21092513  0.17113413  0.13960187  0.20540032

    0.16800016  0.          0.          0.          0.

    0.          0.          0.          0.          0.        ]

  [ 1.4674015   2.85689525  1.46740146  0.21256978  0.17113413

    0.21092513  0.5         0.29351308  0.21256981  0.2109251

    0.17113412  0.          0.          0.          0.

    0.          0.          0.          0.          0.        ]

[ 1.46740144  2.85689538  1.46740145  0.21256978  0.21092513

    0.17113413  0.29351308  0.5         0.21256977  0.17113412

    0.21092513  0.          0.          0.          0.

    0.          0.          0.          0.          0.        ]

  [ 0.91279491  1.4655122   2.85945178  0.12268391  0.13960186

    0.13960187  0.21256981  0.21256977  0.5         0.29325366

    0.29325365  0.          0.          0.          0.

    0.          0.          0.          0.          0.        ]

  [ 1.14239698  1.4585072   2.85804504  0.13960187  0.1680002

    0.20540032  0.2109251   0.17113412  0.29325366  0.5

    0.29200266  0.          0.          0.          0.

    0.          0.          0.          0.          0.        ]

  [ 1.14239675  1.4585072   2.85804493  0.13960185  0.20540029

    0.16800016  0.17113412  0.21092513  0.29325365  0.29200266

    0.5         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.          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.

    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.        ]]]

/Users/peastman/workspace/deepchem/deepchem/feat/molecule_featurizers/coulomb_matrices.py:141: RuntimeWarning: divide by zero encountered in true_divide

  m = np.outer(z, z) / d

注意,有很多元素为0。为了组合多个分子到一个批我们要求所有的Coulomb矩阵有相同的大小,即便分子有不同的原子数。我们指定max_atoms=20,所以返回的矩阵大小为(20, 20)。分子仅有11个原子,所以只有11 by 11子矩阵为非零。

CoulombMatrixEig

Coulomb矩阵有一个非常重要的特性是它们的分子旋转和平移不变性能,因为原子间的距离和原子数量不变。这种考虑对称性对于学习更容易。旋转一个分子不会改变它的物理性质。如果特征化不变,模型学习旋转并不重要。但是如果特征化是不变的则模型自动得到它的特征。

在另一个重要的对称性下Coulomb矩阵是不变的:原子索引排列。分子的物理物性并不取决于哪个原子称为“原子1”,而是取决于Coulomb矩阵。为了处量这一点,引入CoulumbMatrixEig特征化器,它使用Coulomb矩阵的特征值谱,并对于随机原子的索引不变。这个特征化器的不足之处是它包含的信息更少($N$ 个特征值取代 $N \times N$矩阵),所以模型更受限以它所学习的东西。

CoulombMatrixEig继承自CoulombMatrix并通过计算分子的不同构像的Coulomb矩阵来特征化分子,然后计算Coulomb矩阵的特征值。这些特征值然后依不同分子的不同原子填充。

In [7]:

coulomb_mat_eig = dc.feat.CoulombMatrixEig(max_atoms=20)

features = coulomb_mat_eig(propane_mol)

print(features)

[[60.07620303 29.62963149 22.75497781  0.5713786   0.28781332  0.28548338

   0.27558187  0.18163794  0.17460999  0.17059719  0.16640098  0.

   0.          0.          0.          0.          0.          0.

   0.          0.        ]]

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值