diff options
Diffstat (limited to 'sourcecodes/bnt-master/SLP/learning/learn_struct_tan.m')
| -rw-r--r-- | sourcecodes/bnt-master/SLP/learning/learn_struct_tan.m | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/sourcecodes/bnt-master/SLP/learning/learn_struct_tan.m b/sourcecodes/bnt-master/SLP/learning/learn_struct_tan.m new file mode 100644 index 00000000..df122b43 --- /dev/null +++ b/sourcecodes/bnt-master/SLP/learning/learn_struct_tan.m @@ -0,0 +1,104 @@ +function dag = learn_struct_tan(data, class_node, root, node_sizes, scoring_fn) +% LEARN_STRUCT_TAN Learn the structure of the tree augmented naive bayesian network +% (with discrete nodes) +% dag = learn_struct_tan(app, class, root, node_sizes) +% +% Input : +% data(i,m) is the value of node i in case m +% class_node is the class node +% root is the root node of the tree part of the dag (must be different from the class node) +% node_sizes = 1 if gaussian node, +% scoring_fn = 'bic' (default value) or 'mutual_info' +% +% Output : +% dag = adjacency matrix of the dag +% +% V1.1 : 21 may 2003, (O. Francois - francois.olivier.c.h@gmail.com, Ph. Leray - philippe.leray@univ-nantes.fr) +% V1.2 : may 2005 bug correction about node types (Navid Serrano <Navid.Serrano@jpl.nasa.gov>) + + +if nargin <4 + error('Requires at least 4 arguments.') +end + +if nargin == 4 + scoring_fn='bic'; +end; + +if class_node==root + error(' The root node can''t be the class node.'); +end + +% if root>class_node +% root=root-1; +% end + +N=size(data,1); +node_types=cell(N-1,1); +notclass=setdiff(1:N,class_node); +for i=1:N + if node_sizes(i)==1 + node_types{i}='gaussian'; + else + node_types{i}='tabular'; + end +end + +dag=zeros(N); +T = learn_struct_mwst4tan(data, ones(1,N), node_sizes, node_types, scoring_fn, root, class_node); +dag=T; +dag(class_node,notclass)=1; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function [T, score_mat] = learn_struct_mwst4tan(data, discrete, node_sizes, node_type, scoring_fn, root, class) + +if nargin <4 + error('Requires at least 4 arguments.') +end + +if nargin == 4 + scoring_fn='bic'; root=1; +end; + +if nargin == 5 + root=1; +end; + +N=size(data,1); +score_mat=zeros(N,N); +score_mat(class,:)=Inf; +score_mat(:,class)=Inf; + +switch scoring_fn +case 'bic', + for i=mysetdiff(1:(N-1), class) + score2 = score_family(i, [class], node_type{i}, scoring_fn, node_sizes, discrete, data,[]); + for j=mysetdiff((i+1):N, class) + score1 = score_family(i, [j,class], node_type{i}, scoring_fn, node_sizes, discrete, data,[]); + score = score2-score1; + score_mat(i,j)=score; + score_mat(j,i)=score; + end + end +case 'mutual_info', % tabular nodes only + for i=mysetdiff(1:(N-1), class) + for j=mysetdiff((i+1):N, class) + score_mat(i,j)= -cond_mutual_info_score(i,node_sizes(i),j,node_sizes(j),class,node_sizes(class),data); + score_mat(j,i)=score_mat(i,j); + end + end +otherwise, + error(['unrecognized scoring fn ' scoring_fn]); +end + +variab = mysetdiff(1:N,class); +%score_mat +G = minimum_spanning_tree(score_mat(variab,variab)); +if root>class, root=root-1;end +T = mk_rooted_tree(G, root); +T1 = full(T); +T=zeros(N); +T(variab,variab)=T1; + + + |
