⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 learn_struct_gs2.m.svn-base

📁 bayesian network structrue learning matlab program
💻 SVN-BASE
字号:
function [dag, best_score, cache] = learn_struct_gs2(data, nodesizes, seeddag, varargin)%% LEARN_STRUCT_GS2(data,seeddag) learns a structure of Bayesian net by Greedy Search.% dag = learn_struct_gs(data, nodesizes, seeddag)%% dag: the final structure 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% cache : data structure used to memorize local score computations %   (cf. SCORE_INIT_CACHE function)%% by Gang Li @ Deakin University (gli73@hotmail.com)% (use mk_nbrs_of_dag_topo, developped by Wei Hu, instead of mk_nbrs_of_dag)% (Caching implementation : olivier.francois@insa-rouen.fr, philippe.leray@insa-rouen.fr)%[N ncases] = size(data);if (nargin < 3 )     seeddag = zeros(N,N); % mk_rnd_dag(N); %call BNT functionelseif ~acyclic(seeddag)    seeddag = mk_rnd_dag(N); %zeros(N,N);end;% set default paramsscoring_fn = 'bic';verbose  = 'yes';cache=[];% get paramsargs = 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');    		case 'cache',  cache=args{i+1} ;    		end;    	end;    end;end;done = 0;[best_score cache] = score_dags(data,nodesizes, {seeddag},'scoring_fn',scoring_fn,'cache',cache);while ~done    [dags,op,nodes] = mk_nbrs_of_dag_topo(seeddag);    nbrs = length(dags);    [scores cache] = score_dags(data, nodesizes, dags,'scoring_fn',scoring_fn,'cache',cache);    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;outcount = 0; [best_score cache] = score_dags(data,nodesizes, {seeddag},'scoring_fn',scoring_fn,'cache',cache);while outcount < 2    innercount = 0;    for i=1:N        for j=1:N           if i==j, continue;    end;           if seeddag(i,j) == 0  % No edge i-->j, then try to add it               tempdag = seeddag;               tempdag(i,j) = 1;               if acyclic(tempdag)                    [temp_score cache] = score_dags(data,nodesizes, {tempdag},'scoring_fn',scoring_fn,'cache',cache);                    if temp_score > best_score                        seeddag = tempdag;                        best_score= temp_score;                        innercount = innercount +1;                    end;               end           else  % exists edge i--j, then try reverse it or remove it               tempdag = seeddag;               tempdag(i,j) = 0; tempdag(j,i) = 1;                if acyclic(tempdag)                   [temp_score cache] = score_dags(data,nodesizes, {tempdag},'scoring_fn',scoring_fn,'cache',cache);                   if temp_score > best_score                       seeddag = tempdag;                       best_score = temp_score;                       innercount = innercount +1;                   else                       tempdag = seeddag;                       tempdag(i,j) = 0;                       [temp_score cache] = score_dags(data,nodesizes, {tempdag},'scoring_fn',scoring_fn,'cache',cache);                       if temp_score > best_score                           seeddag = tempdag;                           best_score= temp_score;                           innercount = innercount +1;                       end;                   end;               else                   tempdag = seeddag;                   tempdag(i,j)=0;                   [temp_score cache] = score_dags(data,nodesizes, {tempdag},'scoring_fn',scoring_fn,'cache',cache);                   if temp_score > best_score                       seeddag = tempdag;                       best_score= temp_score;                       innercount = innercount +1;                   end;               end;           end;        end; % end for j    end; % end for i    if innercount == 0        outcount = outcount +1;    end;end;  % end whiledag = seeddag;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -