【问题标题】:How to implement a mismatch kernel function in MATLAB?如何在 MATLAB 中实现不匹配的核函数?
【发布时间】:2016-04-03 09:34:23
【问题描述】:

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

对于不匹配核函数,它允许m个不匹配。例如'tool'有3个3-gram('too', 'ool'),不匹配核函数会计入 'aoo','boo',...,'zoo','tao'...'tzo','toa'...'toz',.... 当 m 为 1 时。 具体解释见http://www.cs.columbia.edu/~cleslie/cs4761/papers/string-kernel-slides.pdf 见第 12-17 页

如何编写一个可以计算该指标的 MATLAB 函数?

非常感谢。

【问题讨论】:

  • 您提到了一篇研究论文并链接到一个 60 页的幻灯片集,并询问如何在 Matlab 中实现某些东西。对于任何想要回答您的问题的人来说,这是相当多的材料可供使用。更好的方法是尝试自己做这件事,一旦遇到具体的更容易总结的地方就提出问题,然后发布相关代码。
  • 感谢您的建议。我已经删除了论文并指出了幻灯片的具体范围。我想如果其他人看过这篇论文,回答这个问题会容易得多。主要问题是如何在可容忍的失配范围内实现之前的频谱串函数。我读过很多关于后缀树或最低共同祖先的参考资料,但我仍然没有任何想法,所以我提出了这个问题。

标签: matlab mismatch subsequence


【解决方案1】:

我要提出的解决方案实际上是基于蛮力方法(没有花哨的不匹配树)。
如果您正在处理核苷酸,那么您只有 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 的长度。

第三,让我们从alphabet计算k符号的所有可能组合:

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

这个 sn-p 按顺序预先分配一个带有k 个单元的单元阵列。在第二个表达式之后,在这 3 个单元格中,将有来自 alphabet 的值带有“不同时期”(第一个单元格:abcdefh...;第二个单元格有 26 次 a em>, 26 次 b 等等;第 3 个单元格有 2*26 次 a, 2*26 次 b 等等.. .) 加上“26”,因为它们是字母表中的字母。最后一行将元胞数组 C 展开为矩阵,然后按字母顺序对组合进行排序。归功于Eithan T
注意:如果在此步骤之后内存不足(就内存而言,这是最昂贵的),您也可以删除元胞数组@由于命令clear C,来自主内存的987654337@。从现在开始,我们不需要这样的变量了。

第四,将combs中的每一行与目标k-mer进行比较:

fun=@(a,b) (a~=b);
comparisons=bsxfun(fun,combs,kmerUT);

所以我们声明一个函数fun,如果ab 的位置不同j,它只返回一个逻辑向量,1 在位置j > 然后应用(感谢bsxfun())这样的函数到combs 中的所有行。换句话说,我们将每一行与被测 k-mer 进行比较。因此,comparisons 将是一个逻辑矩阵,其中任何行都是此类比较的结果。
注意combs 是另一个可能占用大量内存的变量。既然我们从现在开始不需要它,你也可以clear combs

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

counter=sum(comparisons,2);

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

六、统计mkmerUT不匹配的组合数:

result=sum(counter<=m);

【讨论】:

  • 感谢您的回答。这很棒。我认为它会使用一些像后缀树这样的方法。但事实证明这很好,只是它占用了太多空间。
  • @AlisaW,我完全同意。对于较大的字母和/或 k 的较大值,此方法可能会占用大量内存。您可以执行初步分析,考虑到组合的数量Ncard(alphabet)^k 其中 card(alphabet) 是字母表中的值的数量k 是 k-mers 的长度。当然,每个组合都有长度 k,因此 N*k 是包含所有组合的矩阵的大小。
猜你喜欢
  • 2014-06-21
  • 1970-01-01
  • 2016-07-08
  • 2014-03-30
  • 2014-05-28
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多