用matlab编程,假设有如图的草地模型,我想对比用最大似然估计、贝叶斯估计、EM算法分别计算出的草坪湿润的概率,并说明三者用在本模型的优缺点;以及最大似然估计和贝叶斯估计结合起来使用比EM算法的精准在哪里体现?
草地模型:
c代表乌云,s代表花洒,w代表草地湿润,r代表雨天
参考最大似然估计和贝叶斯估计结合起来的代码编程:(MATLAB没找到代码块,我先用c的代码块在这里粘贴)
N = 4;
dag = zeros(N,N);
C = 1; S = 2; R = 3; W = 4;
dag(C,[R S]) = 1;
dag(R,W) = 1;
dag(S,W)=1;
ns = 2*ones(1,N); % 给出每个节点状态值数
bnet = mk_bnet(dag, ns); %使用工具箱的函数mk_bnet根据DAG和ns生成一个贝叶斯网络bnet
bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]); %定义该贝叶斯网络bnet的条件概率表,即贝叶斯网络参数
bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]);
bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]);
bnet.CPD{W} = tabular_CPD(bnet, W, [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);
%画出建立好的贝叶斯网络
figure
draw_graph(dag)
CPT = cell(1,N); %将贝叶斯网络bnet的参数取出存在CPT里,来和后面的函数learn_params 学得的参数CPT4和函数bayes_update_params学得的参数CPT5作对比。
for i=1:N
s=struct(bnet.CPD{i}); % violate object privacy
CPT{i}=s.CPT;
end
% 根据贝叶斯网络bnet生成一些数据samples,供函数learn_params和函数bayes_update_params学习使用。
nsamples = 1000;
samples = cell(N, nsamples);
for i=1:nsamples
samples(:,i) = sample_bnet(bnet);
end
data = cell2num(samples);
% 先是生成一个贝叶斯网络bnet2(与第14行完全相同),然后使用函数tabular_CPD初始化该贝叶斯网络参数
bnet2 = mk_bnet(dag, ns);
seed = 0;
rand('state', seed); %保证每次运行结果都一样
bnet2.CPD{C} = tabular_CPD(bnet2, C, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet2.CPD{R} = tabular_CPD(bnet2, R, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet2.CPD{S} = tabular_CPD(bnet2, S, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet2.CPD{W} = tabular_CPD(bnet2, W, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
% 计算最大似然估计
bnet4 = learn_params(bnet2, samples);
% 计算贝叶斯估计
bnet5 = bayes_update_params(bnet2, samples);
CPT4 = cell(1,N);
for i=1:N
s=struct(bnet4.CPD{i}); %将函数learn_params学得的参数存到CPT4当中
CPT4{i}=s.CPT;
end
CPT5 = cell(1,N);
for i=1:N
s=struct(bnet5.CPD{i}); % violate object privacy
CPT5{i}=s.CPT;
assert(approxeq(CPT5{i}, CPT4{i}))
end
engine = jtree_inf_engine(bnet4);
ev = cell(1,N);
ev{S} = 1;
ev{R} = 1;
engine = enter_evidence(engine, ev);
m1 = marginal_nodes(engine, 1);
fprintf('P(W|S,R)1=%5.3f,P(W|S,R)2=%5.3f,\n',m1.T(1),m1.T(2))