4.2.7.1.1. 集合相似性计算 MDAnalysis.analysis.encore.similarity

作者:

马泰奥·蒂贝蒂,Wter Boomsma,Tone Bengtsen

在 0.16.0 版本加入.

该模块包含中描述的蛋白质集合之间的相似性度量的实现 [ᵇLindorff-Larsen2009] 。有关实现和示例,请参阅 [ᵇTiberti2015]

该模块包括处理系综和轨迹的设施,通过 Universe 类,执行集合空间的聚类或降维,从输入数据估计多变量概率分布,等等。Encore可用于比较实验和模拟派生的系综,以及从依赖时间的模拟估计轨迹的收敛。

Encore包括三种不同的方法,用于计算在各个功能中实现的合奏之间的相似性度量:

  • 和声系综相似性 : hes()

  • 聚类集合相似度 : ces()

  • 降维集合相似性 : dres()

以及评估轨迹收敛的两种方法:

在已发表的作品中使用此模块时,请注明 [ᵇTiberti2015]

参考文献

[ᵇLindorff-Larsen2009] (1,2,3)

Kresten Lindorff-Larsen and Jesper Ferkinghoff-Borg. Similarity measures for protein ensembles. PLOS ONE, 4(1):1–13, 01 2009. doi:10.1371/journal.pone.0004203.

[ᵇTiberti2015] (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27)

Matteo Tiberti, Elena Papaleo, Tone Bengtsen, Wouter Boomsma, and Kresten Lindorff-Larsen. Encore: software for quantitative ensemble comparison. PLOS Computational Biology, 11(10):1–16, 10 2015. doi:10.1371/journal.pcbi.1004415.

示例

这些例子展示了如何使用安可来计算两个简单系综的相似性度量。这些集合是从MDAnalysis测试套件中获得的,用于两种不同的蛋白质ADK模拟。

和声系综相似度的计算 (hes() )首先创建两个系综对象,然后用于计算:

>>> from MDAnalysis import Universe
>>> import MDAnalysis.analysis.encore as encore
>>> from MDAnalysis.tests.datafiles import PSF, DCD, DCD2
>>> ens1 = Universe(PSF, DCD)
>>> ens2 = Universe(PSF, DCD2)
>>> HES, details = encore.hes([ens1, ens2])
>>> print(HES)
[[       0.         38279540.04524205]
 [38279540.04524205        0.        ]]

HES可以假设任何非负值,即不存在上限,因此可以将该测量用作绝对标度。

聚类集合相似度的计算 (ces() )的计算成本更高。它基于聚类算法,而这些算法又需要组成集合的帧之间的相似性矩阵。相似性矩阵是从距离矩阵(默认情况下是RMSD矩阵;需要计算每对元素之间的完整RMSD矩阵)导出的。RMSD矩阵是自动计算的:

>>> from MDAnalysis import Universe
>>> import MDAnalysis.analysis.encore as encore
>>> from MDAnalysis.tests.datafiles import PSF, DCD, DCD2
>>> ens1 = Universe(PSF, DCD)
>>> ens2 = Universe(PSF, DCD2)
>>> CES, details = encore.ces([ens1, ens2])
>>> print(CES)
[[0.         0.68070702]
 [0.68070702 0.        ]]

还可以单独计算RMSD矩阵以重新使用它,例如,用于运行具有不同参数的CES或运行降维集合相似性 (dres() )方法。DRES基于从原始空间使用随机邻近嵌入算法或主成分分析获得的系综的降维构象空间中的概率密度的估计。在以下示例中,使用RMSD矩阵和默认的SPE降维方法将维度降至3:

>>> from MDAnalysis import Universe
>>> import MDAnalysis.analysis.encore as encore
>>> from MDAnalysis.tests.datafiles import PSF, DCD, DCD2
>>> ens1 = Universe(PSF, DCD)
>>> ens2 = Universe(PSF, DCD2)
>>> rmsd_matrix = encore.get_distance_matrix(
...                             encore.utils.merge_universes([ens1, ens2]))
>>> DRES,details = encore.dres([ens1, ens2],
...                             distance_matrix = rmsd_matrix)

还可以使用选项将RMSD矩阵保存在磁盘上 save_matrix **

rmsd_matrix = encore.get_distance_matrix(
                                encore.utils.merge_universes([ens1, ens2]),
                                save_matrix="rmsd.npz")

然后可以加载并在以后重新使用,而不是重新计算:

rmsd_matrix = encore.get_distance_matrix(
                                encore.utils.merge_universes([ens1, ens2]),
                                load_matrix="rmsd.npz")

除了定量的相似性估计之外,降维还可以很容易地可视化,请参阅 Example 中的部分 MDAnalysis.analysis.encore.dimensionality_reduction.reduce_dimensionality 。由于SPE的随机性质,两个相同的系综不一定会导致相似度的准确估计为0,但会非常接近。出于同样的原因,计算与 dres() 两次不一定会产生相同的值,而是两个非常接近的值。

应该指出的是,在 ces()dres() 相似性是使用Jensen-Shannon发散来评估的,得到的上界为ln(2),这表示两个系综之间没有相似性,下界为0.0,表示两个相同的系综。相反, hes() 函数使用Kullback-Leibler散度的对称化版本,该散度是无界的。

4.2.7.1.1.1. 系综比对函数

MDAnalysis.analysis.encore.similarity.hes(ensembles, select='name CA', cov_estimator='shrinkage', weights='mass', align=False, estimate_error=False, bootstrapping_samples=100, calc_diagonal=False)[源代码]

计算系综之间的和声系综相似性(HES)。

HES使用对称形式的Kullback-Leibler散度计算,如中所述 [ᵇTiberti2015]

参数:
  • ensembles (list) -- 用于相似性测量的宇宙对象列表。

  • select (str, optional) -- MDAnalysis格式的ATOM选择字符串。默认为“NAME CA”

  • cov_estimator (str, optional) -- 协方差矩阵估计方法,要么收缩, shrinkage ,或最大可能性, ml 。默认情况下为收缩。

  • weights (str/array_like, optional) -- 指定可选权重。如果 mass 然后选择了大量的系综原子

  • align (bool, optional) -- 是否在计算乐团相似性之前对齐乐团。注意:这会改变乐团的位置,因此会让你的乐团处于不同的状态。(默认为FALSE)

  • estimate_error (bool, optional) -- 是否进行误差估计(默认为FALSE)。

  • bootstrapping_samples (int, optional) -- 仅当Estimate_Error为True时,相似性矩阵将被引导的次数(默认为100)。

  • calc_diagonal (bool, optional) -- 是否计算相似性分数的对角线(即每个合奏相对于自身的相似性)。如果为FALSE(默认),则将改用0.0。

返回:

HES,详细信息 --每对集合之间的调和相似性度量,以及包含每个集合的均值和协方差矩阵的DICT

返回类型:

numpy.array, dictionary

备注

该方法假定每个系综取自多元正态分布。因此,平均值和协方差矩阵是根据每个系综群的分布估计的,并用于通过定义为:

\[D_{kl}(P(X)||Q(X))= \int_{-\infty}^P(Xi)ln(P(Xi)/Q(Xi))= \langLang{}ln(P(X))\rangel{}_P-\langln(Q(X))\rangel{}_P\]

其中 \(\langle{{}}.\rangle{{}}_P\) 表示根据分布计算的期望值 \(P\)

对于每个集合,平均构象被估计为集合上的平均值,并且默认情况下使用收缩估计方法(或者可选地通过最大似然方法)计算协方差矩阵。

注意,对称形式的Kullback-Leibler发散没有上限(不同于例如CES和DRES使用的Jensen-Shannon发散)。

在使用此相似性度量时,请考虑是否要首先对齐合奏(请参见下面的示例)。

示例

为了计算和声系综的相似性,从一个拓扑文件和两个轨迹中创建了两个系综作为宇宙对象。所使用的拓扑和轨迹文件是从MDAnalysis测试套件中获得的,用于蛋白质ADK的两种不同模拟。您可以使用 align=True 首先对齐乐团的选项。这将使所有对象与第一个集合中的当前时间步长对齐。请注意,这会更改 ens1ens2 对象:

>>> from MDAnalysis import Universe
>>> import MDAnalysis.analysis.encore as encore
>>> from MDAnalysis.tests.datafiles import PSF, DCD, DCD2
>>> ens1 = Universe(PSF, DCD)
>>> ens2 = Universe(PSF, DCD2)
>>> HES, details = encore.hes([ens1, ens2])
>>> print(HES)
[[       0.         38279540.04524205]
 [38279540.04524205        0.        ]]
>>> print(encore.hes([ens1, ens2], align=True)[0])
[[   0.         6889.89729056]
 [6889.89729056    0.        ]]

或者,要在如何完成对齐方面获得更大的灵活性,您可以调用 AlignTraj 手动对象:

>>> from MDAnalysis import Universe
>>> import MDAnalysis.analysis.encore as encore
>>> from MDAnalysis.tests.datafiles import PSF, DCD, DCD2
>>> from MDAnalysis.analysis import align
>>> ens1 = Universe(PSF, DCD)
>>> ens2 = Universe(PSF, DCD2)
>>> _ = align.AlignTraj(ens1, ens1, select="name CA", in_memory=True).run()
>>> _ = align.AlignTraj(ens2, ens1, select="name CA", in_memory=True).run()
>>> print(encore.hes([ens1, ens2])[0])
[[   0.         6889.89729056]
 [6889.89729056    0.        ]]

在 1.0.0 版本发生变更: hes 不接受 details 参数,它总是以字典的形式返回计算的详细信息

MDAnalysis.analysis.encore.similarity.ces(ensembles, select='name CA', clustering_method=<MDAnalysis.analysis.encore.clustering.ClusteringMethod.AffinityPropagationNative object>, distance_matrix=None, estimate_error=False, bootstrapping_samples=10, ncores=1, calc_diagonal=False, allow_collapsed_result=True)[源代码]

使用Jensen-Shannon散度计算集合之间的聚类集合相似度(CES),如中所述 [ᵇTiberti2015]

参数:
  • ensembles (list) -- 用于相似性测量的集合对象列表

  • select (str, optional) -- MDAnalysis格式的ATOM选择字符串。默认为“NAME CA”

  • clustering_method -- 对象的单个实例或列表 MDAnalysis.analysis.encore.clustering.ClusteringMethod 来自集群模块的类。通过添加同一聚类的不同实例,可以探索同一聚类方法的不同参数。集群方法选项包括相似性传播(默认)、DBSCAN和KMeans。后两种方法需要安装sknowledython模块。

  • distance_matrix (encore.utils.TriangularMatrix) -- 距离矩阵聚类方法。如果未提供此参数,则将动态计算矩阵。

  • estimate_error (bool, optional) -- 是否进行误差估计(默认为FALSE)。仅支持引导模式。

  • bootstrapping_samples (int, optional) -- 用于估计误差的样本数。

  • ncores (int, optional) -- 要使用的最大核心数(默认为1)。

  • calc_diagonal (bool, optional) -- 是否计算相似性分数的对角线(即每个合奏相对于自身的相似性)。如果为FALSE(默认),则将改用0.0。

  • allow_collapsed_result (bool, optional) -- 一个值的列表的返回值是否应该仅折叠为该值。

返回:

CES,详细信息 --ce包含类似性值,排列在numpy.数组中。如果只提供了一个CLUSTING_METHOD,则输出将是一个二维正方形对称的数值。矩阵元素的顺序取决于输入集合的顺序:例如,如果集合= [第一层、第二层、第三层] 矩阵元素 [0,2] 和 [2,0] 都将包含合奏ens1和ens3之间的相似值。详细说明前面的示例,如果 n 给出了合奏,并 m 提供了CLUSTING_METHOD,输出将是 m 按方法输入序列排序的数组,每个数组都有一个 n X n 对称相似矩阵。详细信息包含有关集群的信息:每个集群的单独大小、质心和与每个集群相关联的帧。

返回类型:

numpy.array, numpy.array

备注

在Jensen-Shannon发散中,ln(2)的上界表示两个系综之间没有相似性,下界0.0表示相同的系综。

为了计算CES,使用亲和传播法(或其他方法,如果指定)来划分整个构象空间。然后,将每个簇中的每个集合的种群作为概率密度函数。最后利用Jensen-Shannon发散度比较了每个系综的不同概率密度函数。

示例

为了计算聚类集合的相似性,使用一个拓扑文件和两个轨迹将两个集合创建为宇宙对象。所使用的拓扑和轨迹文件是从MDAnalysis测试套件中获得的,用于蛋白质ADK的两种不同模拟。要使用不同的集群方法,请设置参数CLUSTING_METHOD(请注意,必须安装skLearning模块)。同样,可以通过添加同一聚类的不同实例来探索同一聚类方法的不同参数。这里只有两个实例的最简单情况 Universe 如图所示:

>>> from MDAnalysis import Universe
>>> import MDAnalysis.analysis.encore as encore
>>> from MDAnalysis.tests.datafiles import PSF, DCD, DCD2
>>> ens1 = Universe(PSF, DCD)
>>> ens2 = Universe(PSF, DCD2)
>>> CES, details = encore.ces([ens1,ens2])
>>> print(CES)
[[0.         0.68070702]
 [0.68070702 0.        ]]
>>> CES, details = encore.ces([ens1,ens2],
...                           clustering_method = [encore.DBSCAN(eps=0.45),
...                                                encore.DBSCAN(eps=0.50)])
>>> print("eps=0.45: ", CES[0])
eps=0.45:  [[0.         0.20447236]
 [0.20447236 0.        ]]
>>> print("eps=0.5: ", CES[1])
eps=0.5:  [[0.         0.25331629]
 [0.25331629 0.        ]]
MDAnalysis.analysis.encore.similarity.dres(ensembles, select='name CA', dimensionality_reduction_method=<MDAnalysis.analysis.encore.dimensionality_reduction.DimensionalityReductionMethod.StochasticProximityEmbeddingNative object>, distance_matrix=None, nsamples=1000, estimate_error=False, bootstrapping_samples=100, ncores=1, calc_diagonal=False, allow_collapsed_result=True)[源代码]

使用Jensen-Shannon散度计算系综之间的降维集合相似性(DRES),如中所述 [ᵇTiberti2015]

参数:
  • ensembles (list) -- 用于相似性测量的集合对象列表

  • select (str, optional) -- MDAnalysis格式的ATOM选择字符串。默认为“NAME CA”

  • dimensionality_reduction_method -- 来自DimensionalityReductionMethod模块的DimensionalityReductionMethod类的单个实例或实例列表。通过添加相同降维类的不同实例,可以探索同一方法的不同参数。提供的方法是随机邻近嵌入(默认)和主成分分析。

  • distance_matrix (encore.utils.TriangularMatrix) -- 构象距离矩阵,如果没有提供,它将从系综数据中实时计算。

  • nsamples (int, optional) -- 要从系综中提取的样本数(默认为1000)。这被用来对密度估计重采样,并计算系综之间的Jensen-Shannon发散。

  • estimate_error (bool, optional) -- 是否进行误差估计(默认为FALSE)

  • bootstrapping_samples (int, optional) -- 用于估计误差的样本数。

  • ncores (int, optional) -- 要使用的最大核心数(默认为1)。

  • calc_diagonal (bool, optional) -- 是否计算相似性分数的对角线(即每个合奏对自身的相似性)。如果为FALSE(默认),则将改用0.0。

  • allow_collapsed_result (bool, optional) -- 一个值的列表的返回值是否应该仅折叠为该值。

返回:

Dres,详细信息 --dres包含相似性值,以numpy.array的形式排列。如果将一个维数作为整数提供,则输出将是一个二维正方形对称的数字数组。矩阵元素的顺序取决于输入集合的顺序:例如,如果集合= [第一层、第二层、第三层] 然后是矩阵元素 [0,2] 和 [2,0] 都将包含合奏ens1和ens3之间的相似值。详细说明前面的示例,如果 n 给出了合奏,并 m 方法,则输出将是 m 按方法输入序列排序的数组,每个数组都有一个 n X n 对称相似矩阵。DETAILS提供了REDIRED_COLISTES的数组。

返回类型:

numpy.array, numpy.array

备注

为了计算相似性,该方法首先使用随机邻近嵌入(或其他)算法将集合投影到较低的维度。然后使用基于高斯核的密度估计方法来估计每个系综的概率密度,然后使用该概率密度来计算每对系综之间的Jensen-Shannon散度。

在Jensen-Shannon发散中,ln(2)的上界表示两个系综之间没有相似性,下界0.0表示相同的系综。然而,由于降维的随机性, dres() ,两个相同的合奏不一定会导致相似度的精确估计为0.0,但会非常接近。出于同样的原因,计算与 dres() 两次不会产生两个相同的数字;必须预料到微小的差异。

示例

为了计算降维集合的相似性,从一个拓扑文件和两个轨迹中创建了两个集合作为宇宙对象。所使用的拓扑和轨迹文件是从MDAnalysis测试套件中获得的,用于蛋白质ADK的两种不同模拟。要使用不同的降维方法,只需设置参数Dimsionality_Reduction_Method即可。同样,可以通过添加同一方法类的不同实例来探索同一集群方法的不同参数。下面是比较以下两个实例的最简单情况 Universe 如图所示:

>>> from MDAnalysis import Universe
>>> import MDAnalysis.analysis.encore as encore
>>> from MDAnalysis.tests.datafiles import PSF, DCD, DCD2
>>> ens1 = Universe(PSF,DCD)
>>> ens2 = Universe(PSF,DCD2)
>>> DRES, details = encore.dres([ens1,ens2])
>>> PCA_method = encore.PrincipalComponentAnalysis(dimension=2)
>>> DRES, details = encore.dres([ens1,ens2],
...                             dimensionality_reduction_method=PCA_method)

除了定量的相似性估计之外,降维还可以很容易地可视化,请参阅 Example 中的部分 MDAnalysis.analysis.encore.dimensionality_reduction.reduce_dimensionality `

4.2.7.1.1.2. 函数引用