--- a +++ b/Demo_MLR/fop_mining.m @@ -0,0 +1,187 @@ +function [model] = fop_mining(net_mat,label) +type=4; +level=3; +fold_num = 1; +parameter_num = 12; + +if(type==4) +[node_num,~,net_num]=size(net_mat); +per_fold = round(net_num/fold_num); +pos_freq_cell = cell(fold_num, 1); +pos_subgraph_cell = cell(fold_num, 1); +neg_freq_cell = cell(fold_num, 1); +neg_subgraph_cell = cell(fold_num, 1); + +pos_thres=zeros(level,1); +step=1.5; +pos_thres(1)=0.5*step; +for ti=2:level + pos_thres(ti)=pos_thres(ti-1)*(step+0.1)*0.5; +end +pos_down_bound=0.03; +pos_up_bound = 0.35; + + +neg_thres=zeros(level,1); +step=1.5; +neg_thres(1)=0.5*step; +for ti=2:level + neg_thres(ti)=neg_thres(ti-1)*(step+0.1)*0.5; +end +neg_down_bound=0.03; +neg_up_bound = 0.35; +end +disp('start mining.'); + +%% +for fi=1:fold_num + disp(['mining the ',num2str(fi),'-th fold''s subgraphs']) + if fold_num ~= 1 + max_idx = fi * per_fold; + if fi==fold_num + max_idx = net_num; + end + min_idx = (fi - 1) * per_fold + 1; + tmp_label = label; + tmp_label(min_idx:max_idx) = 0; + else + tmp_label = label; + end + + st=clock; + + [ neg_subgraph,neg_freq ] = frequent_weight_subgraph_mining( net_mat(:,:,tmp_label == -1),level,neg_down_bound,neg_thres); + + neg_subgraph_cell{fi} = neg_subgraph; + neg_freq_cell{fi} = neg_freq; + et=clock; + disp(['The time of mining ',num2str(fi),'-th fold negative subgraphs is ',num2str(etime(et,st))]); + + st=clock; + [ pos_subgraph,pos_freq ] = frequent_weight_subgraph_mining( net_mat(:,:,tmp_label == 1),level,pos_down_bound,pos_thres); + pos_subgraph_cell{fi}=pos_subgraph; + pos_freq_cell{fi} = pos_freq; + et=clock; + disp(['The time of mining ',num2str(fi),'-th fold positive subgraphs is ',num2str(etime(et,st))]); +end + +model = cell(parameter_num,1); +model{1} = pos_subgraph_cell; +model{2} = pos_freq_cell; +model{3} = neg_subgraph_cell; +model{4} = neg_freq_cell; +model{5} = pos_thres; +model{6} = neg_thres; +model{7} = level; +model{8} = label; +model{9} = pos_up_bound; +model{10} = pos_down_bound; +model{11} = neg_up_bound; +model{12} = neg_down_bound; + +end + + +function [ subgraph_cell,score_cell ] = frequent_weight_subgraph_mining( net_mat,level,alpha,thres) +[node_num,~,net_num]=size(net_mat); + +edge_num=node_num*(node_num-1)/2; + +global subgraph_cell; +global score_cell; +subgraph_cell=cell(level,1); +score_cell=cell(level,1); + +edge2edge_weight(edge_num,edge_num,net_num)=false; +edge_idx1=1; + +tic +for ni=1:node_num-1 + for nj=ni+1:node_num + edge_idx2=1; + for ni2=1:node_num-1 + for nj2=ni2+1:node_num + edge2edge_weight(edge_idx1,edge_idx2,:)=(net_mat(ni,nj,:)-net_mat(ni2,nj2,:)-alpha)>0; + edge_idx2=edge_idx2+1; + end + end + edge_idx1=edge_idx1+1; + end +end +toc + +%% +edge_idx_mat=zeros(node_num,node_num); +idx=1; +for ni=1:node_num-1 + for nj=ni+1:node_num + edge_idx_mat(ni,nj)=idx; + idx=idx+1; + end +end +edge_idx_mat=edge_idx_mat+edge_idx_mat'; + +%% +tic +for ni=1:node_num-1 + for nj=ni+1:node_num + subgraph=[ni,nj]; + %disp('subgraph [' 1,2]'); + do_subgraph_mining(subgraph, node_num,net_num,edge2edge_weight,edge_idx_mat,level,thres); + disp([ni,nj]); + toc + end +end +end + +function do_subgraph_mining(subgraph,node_num,net_num,edge2edge_weight,edge_idx_mat,level,thres) + +global subgraph_cell; +global score_cell; +contain_edge_num=size(subgraph,1); + +if(contain_edge_num-1>=level) + return; +end +contain_node=unique(subgraph); +contain_node_num=length(contain_node); + +score= true(1,net_num); +for ei=1:contain_edge_num-1 + score=score & reshape(edge2edge_weight(edge_idx_mat(subgraph(ei,1),subgraph(ei,2)),edge_idx_mat(subgraph(ei+1,1),subgraph(ei+1,2)),:),1,net_num); +end +new_subgraph=[subgraph;0,0]; + +for ni=1:contain_node_num + for nj=1:node_num + + if(nj==contain_node(ni)) + continue; + end + + is_contain=false; + for ei=1:contain_edge_num + if (sum([contain_node(ni),nj]==subgraph(ei,:))==2 || sum([nj,contain_node(ni)]==subgraph(ei,:))==2) + is_contain=true; + break; + end + end + if(is_contain) + continue; + end + + new_score=score & reshape(edge2edge_weight(edge_idx_mat(subgraph(contain_edge_num,1),subgraph(contain_edge_num,2)),edge_idx_mat(contain_node(ni),nj),:),1,net_num); + new_score=sum(new_score)/net_num; + + if(new_score>thres(contain_edge_num)) + new_subgraph(contain_edge_num+1,:)=[contain_node(ni),nj]; + subgraph_cell{contain_edge_num}{length(subgraph_cell{contain_edge_num})+1}=new_subgraph; + score_cell{contain_edge_num}(length(score_cell{contain_edge_num})+1)=new_score; + if(contain_edge_num<level) + do_subgraph_mining(new_subgraph, node_num,net_num,edge2edge_weight,edge_idx_mat,level,thres); + end + end + end +end +end +