使用到的六个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函数 评价人源相似度