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

📄 update_parms.m

📁 The BNL toolbox is a set of Matlab functions for defining and estimating the parameters of a Bayesi
💻 M
字号:
function  [parms,restparms]=update_parms(link,parms,restparms,joint_prob_tabs,design,equiv_class,...
    equiv_class_time,evidence_nodes,partial_evidence_nodes,terminal_merged_nodes,hid_nodes,...
    gausskwadnodes,N);
%update_parms updates parameters of multinomial logistic regression

nrparset=length(parms); %#parameter sets
nrdes=length(design);%#CPTs
%determine for which nodes we have to compute suff stats for each separate case
%(ungrouped data)

grouped=zeros(nrdes,1);
n=ones(nrdes,1)*N;
for i=1:nrdes
    nd=ndims(design{i});
    siz=size(design{i},nd);
    if siz(end)~=N 
        n(i)=1;
        grouped(i)=1;
    end
end
for i=1:nrparset
    eclass_time=find(equiv_class_time==i);
    eclasses=equiv_class(eclass_time);%find the equiv_classes with same set of parameters
    t=[];
    for j=1:length(equiv_class); %find the equivalent classes
        if ~isempty(find(eclasses==j));
        t=[t j];
        end
    end
    final_freq=[];
    final_tot=[];
    final_des=[];
    for ii=t
        eclass=find(equiv_class==ii);
        post=joint_prob_tabs(eclass);
        if ~mysubset(eclass, terminal_merged_nodes.nodenrs)
            %hidden and partially observed nodes
            %partially observed nodes can be treated as hidden nodes
            %by entering hard evidence, entries become zero, and stay zero
            %during propagation 
            
            if grouped(ii)
                freq=compute_suff_stats(post);
            else
                freq=compute_suff_stats_ind(post);
            end
        else
            merged=[];
            for j=1:length(terminal_merged_nodes.nodenrs); %find the numbers of the merged nodes
                if ~isempty(find(eclass==terminal_merged_nodes.nodenrs(j)));
                  merged=[ merged j];
                end
            end
            nrvars=terminal_merged_nodes.nrvars( merged(1));
            data=terminal_merged_nodes.data(merged);
            f=find(terminal_merged_nodes.nrvars(merged)~=nrvars);
            if ~isempty(f) error('equiv merged nodes should have same number of variables'), end
            S_item=terminal_merged_nodes.respcat{merged(1)}(1);
            if grouped(ii)
                freq=compute_suff_stats(post,data,nrvars,S_item,N);
            else
                freq=compute_suff_stats_ind(post,data,nrvars,S_item,N);
            end
        end
        %freq: dimensions are ordered from highest to lowest nodenr
        %that is: first parents (then items) then respcategories
        %order in parms and design is reversed!
        %change order in freqs
        nd=ndims(freq);
        if~isvector(freq) 
            freq=permute(freq,[nd:-1:1]);
        end
        if grouped(ii)
            siz=size(freq);
            freq=reshape(freq,siz(1),prod(siz(2:end)));
            freq=freq';
        else
            freq=permute(freq,[2:nd  1]);%cases are the first dimension
            %we change it so that it becomes the last one
            
            siz=size(freq);
            freq=reshape(freq,siz(1),prod(siz(2:end)));
            freq=freq';
        end
        final_freq=[final_freq;freq];
        total=sum(freq,2);
        final_tot=[final_tot;total];
        if grouped(ii)
       	des=design{ii};
        else
            siz=size(design{ii});
            des=permute(design{ii},[ 1 3 2]);
            des=reshape(des,siz(1)*siz(3),siz(2));
        end
        
        final_des=[final_des;des];
    end
    %remove final_tot==0 (when no data are observed)
    f=find(final_tot==0);
    
    if ~isempty(f)
        final_tot(f,:)=[];
        final_freq(f,:)=[];
        f3=[];
        for ff=1:(size(final_freq,2)-1)
           f3=[f3;(f-1)*(size(final_freq,2)-1)+ff];
        end
        final_des(f3,:)=[];
        
    end
    li=link{eclasses(1)};
    if strmatch(li,'multinomial')
        [pars,restpars]=fit_multinom_logistic( parms{i},restparms{i},final_des, final_freq,final_tot,1e-8);
        %[pars,restpars]=fit_ordered_logisticb(li, parms{i},restparms{i},final_des, final_freq,final_tot,1e-6);
   else [pars,restpars]=fit_ordered_logistic( li,parms{i},restparms{i},final_des, final_freq,final_tot,1e-8);
        
       end
    
    parms{i}=pars;
    restparms{i}=restpars;
end

⌨️ 快捷键说明

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