使用MuE的生物序列模型

警告

pyro.contrib.mue 中的代码正在开发中。 此代码不保证保持向后兼容性。

pyro.contrib.mue 提供了用于处理生物序列数据的建模工具。特别是它实现了MuE分布,这些分布被用作基于多序列对齐预处理的完全生成替代方案。

参考: MuE模型在Weinstein和Marks(2021)中有所描述, https://www.biorxiv.org/content/10.1101/2020.07.31.231381v2

MuE模型示例

MuE 观测模型示例。

class ProfileHMM(latent_seq_length, alphabet_length, prior_scale=1.0, indel_prior_bias=10.0, cuda=False, pin_memory=False)[source]

基础类: torch.nn.modules.module.Module

轮廓HMM。

该模型由回归器序列上的常数分布(一个delta函数)加上MuE观测分布组成。先验都是正态分布,并通过softmax函数推送到单纯形上。

Parameters
  • latent_seq_length (int) – 潜在回归序列的长度 M。 必须大于或等于 1。

  • alphabet_length (int) – 序列字母表的长度(例如,氨基酸为20)。

  • prior_scale (float) – 先验分布的标准差。

  • indel_prior_bias (float) – 不发生的indel的对数概率的先验分布的平均值。较高的值会导致indels的概率较低。

  • cuda (bool) – 在训练期间将数据传输到GPU。

  • pin_memory (bool) – 固定内存以加快GPU传输。

fit_svi(dataset, epochs=2, batch_size=1, scheduler=None, jit=False)[来源]

使用随机变分推断推断近似后验。

这运行了SVI。它是一种近似推理方法,对于快速迭代概率模型非常有用。

Parameters
  • dataset (Dataset) – 训练数据集。

  • epochs (int) – 训练的轮数。

  • batch_size (int) – 小批量大小(序列数量)。

  • scheduler (pyro.optim.MultiStepLR) – 优化调度器。 (默认: Adam 优化器, 0.01 恒定学习率。)

  • jit (bool) – 是否使用jit编译的ELBO。

evaluate(dataset_train, dataset_test=None, jit=False)[source]

评估训练和测试数据集的性能(对数概率和每个残基的困惑度)。

Parameters
  • dataset (Dataset) – 训练数据集。

  • dataset – 测试数据集。

  • jit (bool) – 是否使用jit编译的ELBO。

class FactorMuE(data_length, alphabet_length, z_dim, batch_size=10, latent_seq_length=None, indel_factor_dependence=False, indel_prior_scale=1.0, indel_prior_bias=10.0, inverse_temp_prior=100.0, weights_prior_scale=1.0, offset_prior_scale=1.0, z_prior_distribution='Normal', ARD_prior=False, substitution_matrix=True, substitution_prior_scale=10.0, latent_alphabet_length=None, cuda=False, pin_memory=False, epsilon=1e-32)[source]

基础类: torch.nn.modules.module.Module

该模型由概率PCA加上MuE输出分布组成。

先验都是正态分布,并且在相关情况下通过softmax映射到单纯形上。

Parameters
  • data_length (int) – 输入序列矩阵的长度,包括末尾的零填充。

  • alphabet_length (int) – 序列字母表的长度(例如,氨基酸为20)。

  • z_dim (int) – z空间的维度数。

  • batch_size (int) – 小批量大小。

  • latent_seq_length (int) – 潜在回归序列的长度(M)。 必须大于或等于1。(默认值:1.1 x 数据长度。)

  • indel_factor_dependence (bool) – 插入/删除概率依赖于潜在变量 z。

  • indel_prior_scale (float) – 插入删除参数先验分布的标准差。

  • indel_prior_bias (float) – 不发生的indel的对数概率的先验分布的平均值。较高的值会导致indels的概率较低。

  • inverse_temp_prior (float) – 逆温度参数先验分布的均值。

  • weights_prior_scale (float) – 因子先验分布的标准差。

  • offset_prior_scale (float) – pPCA模型中偏移(常数)的先验分布的标准差。

  • z_prior_distribution (str) – 潜在变量 z 的先验分布。可以是 'Normal'(pPCA 模型)或 'Laplace'(ICA 模型)。

  • ARD_prior (bool) – 在因子中使用自动相关性确定先验。

  • substitution_matrix (bool) – 使用可学习的替换矩阵 而不是单位矩阵。

  • substitution_prior_scale (float) – 替换矩阵参数先验分布的标准差(当substitution_matrix为True时)。

  • latent_alphabet_length (int) – 潜在回归序列中字母表的长度。

  • cuda (bool) – 在训练期间将数据传输到GPU。

  • pin_memory (bool) – 固定内存以加快GPU传输。

  • epsilon (float) – 用于数值稳定性的小值。

fit_svi(dataset, epochs=2, anneal_length=1.0, batch_size=None, scheduler=None, jit=False)[来源]

使用随机变分推断推断近似后验。

这运行了SVI。它是一种近似推理方法,对于快速迭代概率模型非常有用。

Parameters
  • dataset (Dataset) – 训练数据集。

  • epochs (int) – 训练的轮数。

  • anneal_length (float) – 用于线性退火的先验KL散度权重从0到1的周期数,以改进训练。

  • batch_size (int) – 小批量大小(序列数量)。

  • scheduler (pyro.optim.MultiStepLR) – 优化调度器。 (默认: Adam 优化器, 0.01 恒定学习率。)

  • jit (bool) – 是否使用jit编译的ELBO。

evaluate(dataset_train, dataset_test=None, jit=False)[source]

评估训练和测试数据集的性能(对数概率和每个残基的困惑度)。

Parameters
  • dataset (Dataset) – 训练数据集。

  • dataset – 测试数据集 (可选)。

  • jit (bool) – 是否使用jit编译的ELBO。

embed(dataset, batch_size=None)[source]

获取潜在空间嵌入(z的后验均值)。

Parameters
  • dataset (Dataset) – 要嵌入的数据集。

  • batch_size (int) – 小批量大小(序列数量)。(默认为模型对象的batch_size。)

用于参数化MuEs的状态安排器

class Profile(M, epsilon=1e-32)[source]

基础类: torch.nn.modules.module.Module

Profile HMM 状态排列。根据[1]中的公式 S40 参数化 HMM(对于 j 在 {0, 1, 2} 中,r_{M+1,j} = 1 且 u_{M+1,j} = 0)。有关 Profile HMM 的更多背景信息,请参见[2]。

参考文献

[1] E. N. Weinstein, D. S. Marks (2021) “考虑突变变异性的生成概率生物序列模型” https://www.biorxiv.org/content/10.1101/2020.07.31.231381v2.full.pdf

[2] R. Durbin, S. R. Eddy, A. Krogh, 和 G. Mitchison (1998) “生物序列分析:蛋白质和核酸的概率模型” 剑桥大学出版社

Parameters
  • M (int) – 回归器序列的长度。

  • epsilon (float) – 用于数值稳定性的小值。

forward(precursor_seq_logits, insert_seq_logits, insert_logits, delete_logits, substitute_logits=None)[source]

根据配置文件参数组装HMM参数。

Parameters
  • precursor_seq_logits (Tensor) – 回归器序列 log(x)。应具有最右侧的维度 (M, D) 并且可以广播到 (batch_size, M, D),其中 D 是潜在字母表的大小。应沿最终轴归一化为1,即 precursor_seq_logits.logsumexp(-1) = zeros

  • insert_seq_logits (Tensor) – 插入序列 log(c)。 应具有最右侧维度 (M+1, D) 并且可以广播到 (batch_size, M+1, D)。应沿最终轴进行归一化。

  • insert_logits (Tensor) – 插入概率 log(r)。 应具有最右侧维度 (M, 3, 2) 并且可以广播到 (batch_size, M, 3, 2)。应沿最终轴进行归一化。

  • delete_logits (Tensor) – 删除概率 log(u)。 应具有最右侧维度 (M, 3, 2) 并且可以广播到 (batch_size, M, 3, 2)。应沿最终轴进行归一化。

  • substitute_logits (Tensor) – 替换概率 log(l)。应具有最右侧维度 (D, B),其中 B 是数据的字母表大小,并且可以广播到 (batch_size, D, B)。必须沿最终轴进行归一化。

Returns

initial_logitstransition_logitsobservation_logits。这些参数可以直接用于初始化 MissingDataDiscreteHMM 分布。

Return type

Tensor, Tensor, Tensor

mg2k(m, g, M)[source]

从 (m, g) 索引转换为 k 索引。

缺失或可变长度数据的隐马尔可夫模型

class MissingDataDiscreteHMM(initial_logits, transition_logits, observation_logits, validate_args=None)[source]

基础类: pyro.distributions.distribution.Distribution, Callable

具有离散潜在状态和离散观测的HMM,允许缺失数据或可变长度序列。观测值假定为独热编码;全零行表示缺失数据。

警告

与 pyro 的 pyro.distributions.DiscreteHMM 不同,它计算第一个状态的概率为 initial.T @ transition @ emission 这个分布使用标准的 HMM 惯例, initial.T @ emission

Parameters
  • initial_logits (Tensor) – 一个用于潜在状态初始分类分布的logits张量。应具有最右侧的大小state_dim,并且可以广播到(batch_size, state_dim)

  • transition_logits (Tensor) – 一个用于潜在状态之间转移条件分布的对数张量。应具有最右侧的形状 (state_dim, state_dim)(旧,新),并且可以广播到 (batch_size, state_dim, state_dim)

  • observation_logits (Tensor) – 一个用于从潜在状态生成观测分布的对数张量。应具有最右侧的形状 (state_dim, categorical_size),其中 categorical_size 是分类输出的维度,并且可以广播到 (batch_size, state_dim, categorical_size)

log_prob(value)[source]
Parameters

value (Tensor) – 独热编码的观测值。必须是 实数值(浮点数)并且可以广播到 (batch_size, num_steps, categorical_size) 其中 categorical_size 是分类输出的维度。 缺失数据用零表示,即 value[batch, step, :] == tensor([0, ..., 0])。 可以通过在序列末尾填充零来处理可变长度的观测序列。

sample(sample_shape=torch.Size([]))[source]
Parameters

sample_shape (Size) – 样本形状,最后一个维度必须是 num_steps 并且必须能够广播到 (batch_size, num_steps)。batch_size 必须是整数而不是元组。

filter(value)[source]

计算在每个步骤中状态变量的边际概率,条件是之前的观测结果。

Parameters

value (Tensor) – 独热编码的观测值。 必须是实数值(浮点数)并且可以广播到 (batch_size, num_steps, categorical_size) 其中 categorical_size 是分类输出的维度。

smooth(value)[source]

计算每个位置状态的后验期望值(平滑)。

Parameters

value (Tensor) – 独热编码的观测值。 必须是实数值(浮点数)并且可以广播到 (batch_size, num_steps, categorical_size) 其中 categorical_size 是分类输出的维度。

sample_states(value)[source]

使用前向滤波-后向采样算法进行样本状态。

Parameters

value (Tensor) – 独热编码的观测值。 必须是实数值(浮点数)并且可以广播到 (batch_size, num_steps, categorical_size) 其中 categorical_size 是分类输出的维度。

map_states(value)[source]

使用Viterbi算法计算状态变量的最大后验(MAP)估计。

Parameters

value (Tensor) – 独热编码的观测值。 必须是实数值(浮点数)并且可以广播到 (batch_size, num_steps, categorical_size) 其中 categorical_size 是分类输出的维度。

given_states(states)[source]

基于状态变量的条件分布。

Parameters

map_states (Tensor) – 状态轨迹。必须是整数值(long)并且可以广播到 (batch_size, num_steps)

sample_given_states(states)[source]

根据状态变量对观测值进行采样。

Parameters

map_states (Tensor) – 状态轨迹。必须是整数值(长整型)并且可以广播到 (batch_size, num_steps)

生物序列数据集加载

class BiosequenceDataset(source, source_type='list', alphabet='amino-acid', max_length=None, include_stop=False, device=None)[source]

基础类:Generic[torch.utils.data.dataset.T_co]

加载生物序列数据,可以从fasta文件或python列表中加载。

Parameters
  • source – 输入fasta文件路径(str)或输入序列列表(str列表)。

  • source_type (str) – 输入类型,可以是‘list’或‘fasta’。

  • alphabet (str) – 使用的字母表。预设的字母表有‘amino-acid’和‘dna’;任何其他输入将被解释为字母表本身,即你可以使用‘ACGU’来表示RNA。

  • max_length (int) – 序列的独热编码表示的总长度,包括零填充。默认为数据集中的最大序列长度。

  • include_stop (bool) – 在每个序列的末尾附加停止符号,并将停止符号添加到字母表中。

  • device (torch.device) – 数据应存储在内存中的设备。

write(x, alphabet, file, truncate_stop=False, append=False, scores=None)[source]

将序列样本写入文件。

Parameters
  • x (Tensor) – 单热编码序列,大小为 (data_size, seq_length, alphabet_length)。对于可变长度序列,可能用零填充。

  • alphabet (数组) – 字母表。

  • file (str) – 输出文件,序列将以fasta格式写入。

  • truncate_stop (bool) – 如果为True,序列将在第一个停止符号处被截断(即停止符号及其后的所有内容将不会被写入)。如果为False,整个序列将被写入,包括任何内部的停止符号。

  • append (bool) – 如果为True,序列将附加到输出文件的末尾。如果为False,文件将首先被清空。