如何在 MATLAB 中实现不匹配核函数?
How to implement a mismatch kernel function in MATLAB?
有谁知道如何找到不匹配的子序列模式?
对于不匹配核函数,允许m个不匹配。例如'tool'有3个3-grams('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 函数?
非常感谢。
我要提出的解决方案实际上是基于蛮力方法(没有花哨的不匹配树)。
如果你处理的是核苷酸,你只有 4 个符号,这很好,但是对于大字母表 and/or 和 k
的大值来说,它可能会非常耗费内存。
好消息是它不包含任何循环并且每个语句都是矢量化的,所以它运行得非常快。
首先,我想你知道如何select 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
此代码段按顺序预先分配了一个包含 k
个单元格的单元格数组。在第二个表达式之后,在这 3 个单元格中将有 alphabet
和 "different period" 的值(第一个单元格:abcdefh... ;第二个单元格有 26 次a, 26 次 b 等等;第 3 个单元格有 2*26 次 a, 2* 26 次 b 等等...)用“26”因为它们是字母表中的字母。最后一行将元胞数组 C
展开为矩阵,然后按字母顺序对组合进行排序。归功于 Eithan T.
注意:如果在此步骤后运行内存不足(就内存而言,这是最昂贵的),您也可以删除元胞数组C
来自主内存,这要归功于命令 clear C
。从现在开始我们不需要这样的变量。
第四,将combs
中的每一行与目标k-mer进行比较:
fun=@(a,b) (a~=b);
comparisons=bsxfun(fun,combs,kmerUT);
所以我们声明一个函数 fun
只是 returns 一个逻辑向量 1
在位置 j if a
和 b
在位置 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 个字节,整个向量可能会占用大量内存。现在,如果您已经清除了 C
和 combs
这应该不是问题,但为了完整起见,您可能希望使用整数类型来转换 counter
每个项目 8 个字节。有关 Matlab 中数值类型的更多信息,请参见 here。
六、统计m
内与kmerUT
不匹配的组合数:
result=sum(counter<=m);
有谁知道如何找到不匹配的子序列模式?
对于不匹配核函数,允许m个不匹配。例如'tool'有3个3-grams('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 函数?
非常感谢。
我要提出的解决方案实际上是基于蛮力方法(没有花哨的不匹配树)。
如果你处理的是核苷酸,你只有 4 个符号,这很好,但是对于大字母表 and/or 和 k
的大值来说,它可能会非常耗费内存。
好消息是它不包含任何循环并且每个语句都是矢量化的,所以它运行得非常快。
首先,我想你知道如何select 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
此代码段按顺序预先分配了一个包含 k
个单元格的单元格数组。在第二个表达式之后,在这 3 个单元格中将有 alphabet
和 "different period" 的值(第一个单元格:abcdefh... ;第二个单元格有 26 次a, 26 次 b 等等;第 3 个单元格有 2*26 次 a, 2* 26 次 b 等等...)用“26”因为它们是字母表中的字母。最后一行将元胞数组 C
展开为矩阵,然后按字母顺序对组合进行排序。归功于 Eithan T.
注意:如果在此步骤后运行内存不足(就内存而言,这是最昂贵的),您也可以删除元胞数组C
来自主内存,这要归功于命令 clear C
。从现在开始我们不需要这样的变量。
第四,将combs
中的每一行与目标k-mer进行比较:
fun=@(a,b) (a~=b);
comparisons=bsxfun(fun,combs,kmerUT);
所以我们声明一个函数 fun
只是 returns 一个逻辑向量 1
在位置 j if a
和 b
在位置 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 个字节,整个向量可能会占用大量内存。现在,如果您已经清除了 C
和 combs
这应该不是问题,但为了完整起见,您可能希望使用整数类型来转换 counter
每个项目 8 个字节。有关 Matlab 中数值类型的更多信息,请参见 here。
六、统计m
内与kmerUT
不匹配的组合数:
result=sum(counter<=m);