使用scikit-learn统计不同字母K-mer数量
我正在提取蛋白质序列中不同氨基酸字母的频率。我还在研究一些“简化”的字母表示方法,比如把一些字母合并成一个,比如[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()