有谁知道如何找到不匹配的子序列模式?
对于不匹配内核函数,它允许m个不匹配。例如,'工具'有三个3克('太',' ool'),不匹配核心功能将计数 ' AOO''嘘' ...'动物园''道' ...' TZO'当m为1时,' toa' ...' toz' .... 有关具体说明,请参阅http://www.cs.columbia.edu/~cleslie/cs4761/papers/string-kernel-slides.pdf 请参阅第12-17页
如何编写可以计算此指标的MATLAB函数?
非常感谢。
答案 0 :(得分:0)
我要提出的解决方案实际上是基于强力方法(没有花哨的不匹配树)。
如果您正在处理核苷酸,那么您只有4个符号并且没有问题,但是对于大字母和/或k
的大值,它可能会非常低效。
好消息是,它不包含任何循环,并且每个语句都是矢量化的,因此它的工作速度非常快。
首先,我想你知道如何选择k-mers;如果没有,提议的解决方案here(由gnovice提供的功能n_gram()
)可以很好地工作。
我不喜欢" n-gram",我更喜欢" k-mers"所以我在下文中使用它来表示长度 k 的子串。
其次,让我们声明一些变量:
m=1; k=3;
alphabet='abcdefghijklmnopqrstuvwxyz';
kmerUT='too';
其中m
是距离(如幻灯片中所示),alphabet
相当不言自明(是所有可能值的集合),kmerUT
是k-mer在测试中(即我们想要计算距离的k-mer)和k
是k-mer的长度。
第三,让我们计算来自k
的{{1}}符号的所有可能组合:
alphabet
此片段按顺序预先分配带有C = cell(k, 1); %// Preallocate a cell array
[C{:}] = ndgrid(alphabet); %// Create K grids of values
combs = cellfun(@(x){x(:)}, C); %// Convert grids to column vectors
combs = sortrows([combs{:}]); %// Obtain all permutations
个单元格的单元格数组。在第二个表达式之后,在这3个单元格中,将存在k
的值,其中"不同的时期" (第一个单元格: abcdefh ... ;第二个单元格有26次 a ,26次 b 等等;第三个单元格有2 * 26时间 a ,2 * 26次 b 等等......)" 26"因为它们是字母表中的字母。最后一行将单元格数组alphabet
展开到矩阵中,然后按字母顺序对组合进行排序。致Eithan T的积分
注意:如果您在此步骤之后运行内存不足(这在内存方面是最昂贵的),您也可以从主内存中删除单元数组C
感谢命令C
。从现在开始,我们不需要这样的变量。
第四,将clear C
中的每一行与目标k-mer进行比较:
combs
所以我们声明一个函数fun=@(a,b) (a~=b);
comparisons=bsxfun(fun,combs,kmerUT);
,如果fun
和1
不同,我们只会在位置 j 中返回一个逻辑向量a
位置 j 然后将(感谢b
)此函数应用于bsxfun()
中的所有行。换句话说,我们将每一行与测试中的k-mer进行比较。因此,combs
将是一个逻辑矩阵,其中行是这种比较的结果
注意:comparisons
是另一个可能占用大量内存的变量。由于我们从现在开始不需要它,你也可以combs
。
第五,计算每个测试组合的不相等符号的数量:
clear combs
将counter=sum(comparisons,2);
作为1和0的矩阵,可以简单地对每一行求和,得到每行1的数量(即每行不同符号的数量)。
注意:comparisons
是一个矢量,其大小为卡(字母)^ k 其中卡(字母)是值的数量在counter
中,因为它必须包含所有可能组合的值。在某些情况下,这样的向量可能很大,并且考虑到这样的向量中的每个项目需要8个字节,整个向量可能需要大量的内存。现在,如果您已清除alphabet
和C
它不应该成为问题,但为了完整起见,您可能希望使用整数类型转换combs
每个项目需要少于8字节。有关Matlab中数字类型的更多信息可以找到here。
第六,计算来自counter
m
不匹配的组合数:
kmerUT