使用到的六个esm模型:
python bin/recommend.py
'--model-names',
default=[ 'esm1b', 'esm1v1', 'esm1v2', 'esm1v3', 'esm1v4', 'esm1v5', ]
-
计算概率分布:
logits = model.predict_sequence_prob(seq): 通过模型对输入序列seq进行预测,得到每个位置上各种氨基酸的对数概率值。probs = scipy.special.softmax(logits, axis=1): 对这些对数概率值进行 softmax 操作,将其转换为概率分布。在这里,probs是一个概率矩阵,表示每个位置上各种氨基酸的概率。
-
确定突变:
- 对于每个位置
i(从第二个位置开始,因为第一个位置通常是起始位置):- 获取该位置的原始氨基酸
wt_j = model.alphabet_.tok_to_idx[seq[pos]]和其对应的概率wt_prob = probs[i, wt_j]。 - 遍历该位置可能的所有氨基酸
j:- 排除在
exclude集合中的氨基酸和特殊标记(如<)的氨基酸。 - 如果当前氨基酸不是原始氨基酸
wt_j:- 计算当前氨基酸的概率
mt_prob = probs[i, j]。 - 如果当前氨基酸的概率大于阈值
alpha * wt_prob,则将该突变记录为(位置, 原始氨基酸, 突变后的氨基酸)。
- 计算当前氨基酸的概率
- 排除在
- 获取该位置的原始氨基酸
- 对于每个位置
-
返回突变列表:
- 将满足条件的突变记录在
mutations列表中,并最终返回该列表。
- 将满足条件的突变记录在
代码中的 reconstruct_multi_models 函数的作用是针对给定的野生型序列 wt_seq,通过不同的模型(例如:'esm1b', 'esm1v1', 'esm1v2' 等)进行重构,并比较每个模型生成的突变。具体流程如下:
-
对于每个模型名称
model_name:- 获取相应的模型
model = get_model_name(model_name)。 - 如果
alpha为None,则使用reconstruct函数对野生型序列进行重构,得到wt_new,并计算与原始序列的差异mutations_model = diff(wt_seq, wt_new)。 - 如果
alpha不为None,则使用soft_reconstruct函数进行软重构,得到mutations_model。 - 对于每个突变
mutation在mutations_model中:- 如果
mutation不在mutations_models中,则将其添加,并初始化计数为 0。 - 增加该突变的计数,并将该模型的名称添加到
mutations_model_names中。
- 如果
- 获取相应的模型
-
如果
return_names为True,则返回包含突变计数和模型名称的元组(mutations_models, mutations_model_names);否则,仅返回突变计数mutations_models。
此外,还包含了使用 eval_sapiens函数 评价人源相似度