Diff of /Demo_MLR/fop_mining.m [000000] .. [edb3de]

Switch to side-by-side view

--- 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
+