?? update_parms.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 + -