使用scikit-learn统计不同字母K-mer数量

0 投票
1 回答
1337 浏览
提问于 2025-04-18 00:41

我正在提取蛋白质序列中不同氨基酸字母的频率。我还在研究一些“简化”的字母表示方法,比如把一些字母合并成一个,比如[K]和[R]可以合并成[KR],等等。

我想知道,有什么高效的方法可以:1) 从蛋白质序列中提取不同k-mer的频率(也就是从序列中提取长度为1、2、3的字母的重叠计数),最好是使用scikit-learn自带的工具(比如countvectorizer之类的)?我可以自己生成可能的组合并从字符串中计数,但这样效率很低,我想在我的流程中使用scikit-learn的工具,但这些工具是针对单词的,而不是针对一个长单词中的多个字母。

2) 有没有高效的方法可以使用scikit的countVectorizer或类似工具,针对不同的字母表获取k-mer字母的计数/频率?也就是说,能否把翻译表传给这个方法,直接得到简化字母表的2-mer频率,而不是为每个序列低效地重新计算可能的组合及其频率。

保持顺序等也是很重要的,因为我需要在最后得到特征“名称”(以便将其附加到输出中作为特征列的名称)。非常感谢!

1 个回答

1

你想要一个包含你所有蛋白质中每个“单词”的列表或字典。假设你有以下这些蛋白质:

prot_1 = "mklfgsmhee"
prot_2 = "heelyiggis"

你想要一个函数,能够返回长度为 n 的所有单词,像这样:

>>> words_prot_1 = wording(prot_1, 3)
>>> print words_prot_1
["mkl", "klf", "lfg", "fgs", "gsm", "smh", "mhe", "hee"]
>>> words_prot_2 = wording(prot_1, 3)
>>> print words_prot_2
["hee", "eel", "ely", "lyi", "yig", "igg", "ggi", "gis"]

遍历你的蛋白质,创建一个字典或列表,像这样:

kmers_3 = ["mkl", "klf", "lfg", "fgs", "gsm", "smh", "mhe", "hee",
           "eel", "ely", "lyi", "yig", "igg", "ggi", "gis"]

(注意,重复的词“hee”只出现一次,这可以通过使用 set(list) 或在字典中插入键来轻松实现)。现在同样的 word_prot_1 可以传递给 CountVectorizer,通过 str.join() 来“伪装”文本。像这样:

cv = CountVectorizer(vocabulary=kmers_3)
cv.fit_transform(" ".join(words_prot_1)).toarray()

撰写回答