about summary refs log tree commit diff
path: root/sourcecodes/bnt-master/SLP/learning/learn_struct_hc.m
diff options
context:
space:
mode:
Diffstat (limited to 'sourcecodes/bnt-master/SLP/learning/learn_struct_hc.m')
-rw-r--r--sourcecodes/bnt-master/SLP/learning/learn_struct_hc.m56
1 files changed, 56 insertions, 0 deletions
diff --git a/sourcecodes/bnt-master/SLP/learning/learn_struct_hc.m b/sourcecodes/bnt-master/SLP/learning/learn_struct_hc.m
new file mode 100644
index 00000000..e32dee80
--- /dev/null
+++ b/sourcecodes/bnt-master/SLP/learning/learn_struct_hc.m
@@ -0,0 +1,56 @@
+function [dag,best_score] = learn_struct_hc(data, nodesizes, seeddag, varargin)
+%
+% LEARN_STRUCT_HC(data,seeddag) learns a structure of Bayesian net by Hill Climbing.
+% dag = learn_struct_hc(data, nodesizes, seeddag)
+%
+% dag: the final structurre matrix
+% Data : training data, data(i,m) is the m obsevation of node i
+% Nodesizes: the size array of different nodes
+% seeddag: given seed Dag for hill climbing, optional
+%
+% by Gang Li @ Deakin University (gli73@hotmail.com)
+
+[N ncases] = size(data);
+if (nargin < 3 ) 
+    seeddag = zeros(N,N); % mk_rnd_dag(N); %call BNT function
+elseif ~acyclic(seeddag)
+    seeddag = mk_rnd_dag(N); %zeros(N,N);
+end;
+
+% set default params
+scoring_fn = 'bic';
+verbose  = 'yes';
+
+% get params
+args = varargin;
+nargs = length(args);
+if length(args) > 0
+    if isstr(args{1})
+    	for i = 1:2:nargs
+    		switch args{i}
+    		case 'scoring_fn', scoring_fn = args{i+1};
+    		case 'verbose',  verbose  = strcmp(args{i+1},'yes');
+    		end;
+    	end;
+    end;
+end;
+
+done = 0;
+best_score = score_dags(data,nodesizes, {seeddag},'scoring_fn',scoring_fn);
+while ~done
+    [dags,op,nodes] = mk_nbrs_of_dag(seeddag);
+    nbrs = length(dags);
+    scores = score_dags(data, nodesizes, dags,'scoring_fn',scoring_fn);
+    max_score = max(scores);
+    new = find(scores == max_score );
+    if ~isempty(new) & (max_score > best_score)
+        p = sample_discrete(normalise(ones(1, length(new))));
+        best_score = max_score;
+        seeddag = dags{new(p)};
+    else
+        done = 1;
+    end;
+end;
+
+dag = seeddag;
+