不匹配字符串内核的Python3实现
mismatch-string-kernel的Python项目详细描述
字符串内核不匹配
以下出版物中描述的不匹配内核的简单Python3实现:
%0 Journal Article
%T Mismatch string kernels for discriminative protein classification
%A Leslie, Christina S
%A Eskin, Eleazar
%A Cohen, Adiel
%A Weston, Jason
%A Noble, William Stafford
%J Bioinformatics
%V 20
%N 4
%P 467-476
%@ 1460-2059
%D 2004
%I Oxford University Press
%U https://doi.org/10.1093/bioinformatics/btg431
使用
要了解这个内核的技术细节,请参阅上面的文章。在
初始化内核
首先,你必须定义一个字母表,从中生成k-mers, k-mers的长度k和m-mer之间最大不匹配数,例如:
^{pr2}$然后,可以使用以下参数创建MismatchKernel
对象:
frommismatch_kernelimportMismatchKernelmk=MismatchKernel(ALPHABET,k,m)
将字符串映射到(k-m)特征空间
您可以使用vectorize(x)
函数将字符串x
映射到(k-m)特性空间。在
请注意,字母表通常区分大小写,因此如果您的字符串需要
区分大小写(即“字符串”!=“StRiNg”),您的字母表应同时包含两个大写字母
和小写字母。而且这将大大增加计算时间,因为
k-mer功能空间具有维度#(字母表)^k;如果需要,也可以这样做
区分标点符号,例如在字母表上面的字符串会有所不同
基于它们包含的空间(即“空间”!=“spa ce”)。
通常,传递给该模块函数的字符串将被规范化,即
不在字母表中的字符将被删除。例如,如果您调用vectorize("String")
在定义了上面的字母表之后,你实际上是在向量化“tring”,所以你应该
改为调用vectorize("String".lower())
。在
vectorize(x)
函数返回一个元组(x_norm, dok)
,其中x_norm
是实际的字符串
它已经被矢量化(即x
标准化),所以你可以检查你是否真的是这样
想要向量化,并且dok
是DOK(密钥字典)中的向量
格式(因为向量通常是稀疏的),所以它将像字典一样
{2: 1, 3: 1, 14: 1, 17: 2, 30: 1, 41: 1, ...}
表示向量有非零值
只在字典键的位置,即[0, 0, 1, 1, 0, ..., 0, 1, 0, 0, 2, ...]
。
您可以将x_norm
与向量一起推送到字典中,这样就不必这样做了
再次矢量化,这就是get_kernel()
函数的实际作用。在
示例
x_norm,vect=mk.mismatch_tree.vectorize("doc. Frankenstein".lower())print("{} -> {}".format(x_norm,vect))
> doc frankenstein -> {10: 1, 13: 1, 37: 1, 64: 1, ...}
计算两个字符串之间的内核
您可以使用get_kernel(x1, x2)
函数来获取x1
和{
示例
ker=mk.get_kernel("doc. Frankenstein".lower(),"doc. Drunkenstein".lower())print(ker)
> 0.7500011542039571
使用或提供已经计算的失配向量和核
get_kernel
函数将在MismatchKernel
对象中保存每个
字符串在MISMATCH_VECTORS
属性中矢量化,这是一个存储
字符串作为键,相应的向量作为值
(即{'doc frankenstein': {10: 1, 13: 1, 37: 1, 64: 1, ...}, 'doc drunkenstein': {80: 1, 98: 1, 116: 1, 121: 1, ...}
)所以如果你打给next
mk.get_kernel("doc drunkenstein", "doc nykterstein"
它不会再矢量化"doc drunkenstein"
。在
同样,每个计算的内核都将存储在KERNEL_MATRIX
属性中,即
将字符串存储为键的字典和另一个以字符串作为键的字典和
两个键之间的内核值作为值
(即{'doc frankenstein': {'doc drunkenstein': 0.7500011542039571, 'doc nykterstein': 0.5041614599291009}}
)。
如果要计算一批字符串的内核,可以从
相同的MismatchKernel
对象,因此不匹配向量或内核具有的字符串
不会再计算了。在
如果已经有一个或两个字典,可以将其传递给MismatchKernel
施工单位:
mk=MismatchKernel(ALPHABET,k,m,vectors_dict,kernels_dict)
- 项目
标签: