kmer_kernel.m

来自「《模式分析的核方法》一书中的源代码」· M 代码 · 共 107 行

M
107
字号
function K = kmer_kernel(S,k)%function K = kmer_kernel(S,k)%% Computes the k-mer kernel between the strings stored in S%%INPUTS% S = a cell array containing all strings% k = an integer indicating the size of the k-mer%%OUTPUTS% K = the kmer kernel evaluated between all strings%%%For more info, see www.kernel-methods.net%%Author: Tijl De Bie, march 2004.% Bug fixed october 2004 (thanks to Neil Lawrence).% Added a test for speed-up in the iterates function, july 2005.nS=length(S);alphabet=[];for j=1:nS    for i=1:length(S{j})        alphabet=union(alphabet,S{j}(i));    endendna=length(alphabet);K=zeros(nS,nS);for i=1:na    i    present=[];    clear newS newind    ct=0;    for j=1:nS        newind_store=[];        newind_store=find(S{j}(1:end-k+1)==alphabet(i));        if ~isempty(newind_store)            ct=ct+1;            present=[present ; j];            newS{ct}=S{j};            newind{ct}=newind_store;        end    end    if ~isempty(present)        K(present,present)=K(present,present)+iterates(newS,newind,newind,1,k,alphabet(i),alphabet);    endendfunction K=iterates(S,indstart,indend,it,maxit,a,alphabet)%function K=iterates(S,indstart,indend,it,maxit,a,alphabet)%% A help function for kmer_kernel.m%%%Author: Tijl De Bie, march 2004.na=length(alphabet);nS=length(S);if it==maxit    for i=1:nS        number(i,1)=length(indend{i});    end    K=number*number';    returnelseif length(indstart)==1 && length(indstart{1})==1    K=1;%    disp(['done the speed-up at depth ' num2str(it)])    returnendK=zeros(nS,nS);for i=1:na    ct=0;    present=[];    clear newindstart newindend newS    for j=1:nS        newindstart_store=[];        newindend_store=[];        for k=1:length(indstart{j})            if S{j}(indend{j}(k)+1)==alphabet(i)                newindstart_store=[newindstart_store ; indstart{j}(k)];                newindend_store=[newindend_store ; indend{j}(k)+1];            end        end        if ~isempty(newindend_store)            ct=ct+1;            newindstart{ct}=newindstart_store;            newindend{ct}=newindend_store;            present=[present ; j];            newS{ct}=S{j};        end    end    if ct~=0        K(present,present)=K(present,present)...            +iterates(newS,newindstart,newindend,it+1,maxit,alphabet(i),alphabet);    endend

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?