利用草地湿润模型学习机器学习之参数估计

利用草地湿润模型学习机器学习之参数估计

1 草地湿模型

一个草地湿润模型,Cloudy表示天气是否多云,C=1(F)表示False,C=2(T)表示True,一下表示均相同,Sprinklet表示洒水车是否出动,Rain表示是否下雨,WetGrass表示草地是否是湿的。旁边的表格表示各种条件概率。
利用草地湿润模型学习机器学习之参数估计_第1张图片
贝叶斯网络表示:BNT中使用矩阵方式表示贝叶斯网络,即若节点i到j有一条弧,则对应矩阵中(i,j)值为1,否则为0。上图是一个草地潮湿原因模型。我们使用matlab画出建立好的贝叶斯网络,可以求出单个节点后验概率和多个节点后验概率。

贝叶斯网络

利用草地湿润模型学习机器学习之参数估计_第2张图片

2 代码实现

clear
warning('off')
tic;

%1、建立贝叶斯网络结构
N = 4; % 四个节点,分别是C,S,R,W
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;
figure %输出贝叶斯网络
draw_graph(dag);

false = 1; true = 2;
ns = 2*ones(1,N); % binary nodes 节点状态数

bnet = mk_bnet(dag, ns);

% 利用tabular_CPD设置各个变量的边缘概率
% 入度为0,定义顺序是F- T
% 入度为1,顺序是FF-  FT- TF- TT
% 入度为2,顺序是FFF- FFT- FTF-  FTT-  TFF-  TFT-  TTF-  TTT
bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]); % 手动输入的条件概率
bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]);
bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]);
bnet.CPD{W} = tabular_CPD(bnet, W, [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);

% bnet.CPD{W}

CPT = cell(1,N);
for i=1:N
  s=struct(bnet.CPD{i});  % violate object privacy STRUCT创建或转换为结构数组
  CPT{i}=s.CPT;
end


% Generate training data 构造样本数据 % samples中包括所有节点的观测数据(不包含缺失数据)
nsamples =5000;
% nsamples =3000;
% nsamples =5000;
samples = cell(N, nsamples); %创建单元格数组
for i=1:nsamples
    samples(:,i) = sample_bnet(bnet); % 从贝叶斯网络随机生成一个样本
end
% data = cell2num(samples); % 将二维单元格数组转换为二维数值数组

% Make a tabula rasa
% 保证每次运行结果都一样
bnet2 = mk_bnet(dag, ns); %MK_BNET建立贝叶斯网络
seed = 0;
% rand('state', seed); %手动构造条件概率表cpt
bnet2.CPD{C} = tabular_CPD(bnet2, C, 'clamped', 1, 'CPT', [0.5 0.5], ...
			   '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); % tabular_CPD生成多项式条件概率

%显示估计的参数
Parameter_MLE=bnet2;
CPT_MLE=cell(1,N);
for i=1:N
    s=struct(Parameter_MLE.CPD{i});
    CPT_MLE{i}=s.CPT;
end

Parameter_MLE_W = CPT_MLE{4};


% Find MLEs from fully observed data
% 找到一个完全观察模型的最大似然参数 极大似然估计
bnet4 = learn_params(bnet2, samples);

% Bayesian updating with 0 prior is equivalent to ML estimation
% 对完全观测数据进行贝叶斯参数更新(没有先验时等价于极大似然估计)
bnet5 = bayes_update_params(bnet2, samples);

CPT4 = cell(1,N);
for i=1:N
  s=struct(bnet4.CPD{i});  % violate object privacy
  CPT4{i}=s.CPT ;
end
CPT4{4}
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
CPT5{4}
CPT{4}
toc;

3 结果分析

3.1 耗时统计

利用草地湿润模型学习机器学习之参数估计_第3张图片

3.2 Ground truth与学习参数的差异对比(MLE与Bayesian两种算法分别在不同的数据集上的条件概率比对)

利用草地湿润模型学习机器学习之参数估计_第4张图片

4 结论

在本次实验中,分别用MLE与Bayesian两种算法在1000、3000、5000的数据集上训练学习草地湿润模型,得出模型估计的条件概率。
实验表明,MLE与Bayesian两种算法学习出来的条件概率基本一致,并且随之数据集量的增大,模型训练出来的条件概率更接近真实值,也就是说,可以通过提高数据集的数据量大小来增强模型的精确度。

你可能感兴趣的:(机器学习)