如何在MATLAB中实现不匹配的内核函数?

时间:2016-04-03 09:34:23

标签: matlab mismatch subsequence

有谁知道如何找到不匹配的子序列模式?

对于不匹配内核函数,它允许m个不匹配。例如,'工具'有三个3克('太',' ool'),不匹配核心功能将计数 ' AOO''嘘' ...'动物园''道' ...' TZO'当m为1时,' toa' ...' toz' .... 有关具体说明,请参阅http://www.cs.columbia.edu/~cleslie/cs4761/papers/string-kernel-slides.pdf 请参阅第12-17页

如何编写可以计算此指标的MATLAB函数?

非常感谢。

1 个答案:

答案 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); ,如果fun1不同,我们只会在位置 j 中返回一个逻辑向量a位置 j 然后将(感谢b)此函数应用于bsxfun()中的所有行。换句话说,我们将每一行与测试中的k-mer进行比较。因此,combs将是一个逻辑矩阵,其中行是这种比较的结果 注意comparisons是另一个可能占用大量内存的变量。由于我们从现在开始不需要它,你也可以combs

第五,计算每个测试组合的不相等符号的数量:

clear combs

counter=sum(comparisons,2); 作为1和0的矩阵,可以简单地对每一行求和,得到每行1的数量(即每行不同符号的数量)。
注意comparisons是一个矢量,其大小为卡(字母)^ k 其中卡(字母)是值的数量在counter中,因为它必须包含所有可能组合的值。在某些情况下,这样的向量可能很大,并且考虑到这样的向量中的每个项目需要8个字节,整个向量可能需要大量的内存。现在,如果您已清除alphabetC它不应该成为问题,但为了完整起见,您可能希望使用整数类型转换combs每个项目需要少于8字节。有关Matlab中数字类型的更多信息可以找到here

第六,计算来自counter m不匹配的组合数:

kmerUT