function[score]=rmho_score(dag,nodes_sizes,train_data,validation_data,class_node_number) %the Risk Minimization Hold Out score %fix dag and data to topological ordering constraint ordering=topological_sort(dag); nodes_sizes=nodes_sizes(ordering); class_node_number=find(ordering==class_node_number); train_data=train_data(ordering,:); validation_data=validation_data(ordering,:); dag=dag(ordering,ordering); %find number of nodes N=length(dag); %all nodes are discrete discrete_nodes=1:N; %build a Bayesian network using the DAG structure bnet=mk_bnet(dag,nodes_sizes,'discrete',discrete_nodes); %apply random CPDs for the network (these values do not effect results!) seed=7; rand('twister',seed); for c1=1:N bnet.CPD{c1}=tabular_CPD(bnet,c1); %bnet.CPD{c1}=tabular_CPD(bnet,c1,'prior_type','dirichlet','dirichlet_type','BDeu'); %alternative end %learn network parameters based on training data bnet=learn_params(bnet,train_data); %score the Bayesian network over the validation data (zero-one loss) %engine=jtree_inf_engine(bnet); %alternative inference engine - junction tree inference engine engine=global_joint_inf_engine(bnet); validation_size=size(validation_data,2); rate_counter=0; for c1=1:validation_size %evidence is the current validation sample, excluding the class variable evidence=validation_data(:,c1); evidence{class_node_number,1}=[]; %enter evidence to the inference engine [engine2,loglik]=enter_evidence(engine,evidence); %calculate P(c|x1,..xn) marg=marginal_nodes(engine2,class_node_number); estimation=find(marg.T==max(marg.T)); if estimation==validation_data{class_node_number,c1} rate_counter=rate_counter+1; end end score=1-rate_counter/validation_size; end