diff options
| author | ziejd2 | 2018-09-13 23:59:20 -0500 |
|---|---|---|
| committer | ziejd2 | 2018-09-13 23:59:20 -0500 |
| commit | e3f7237ffcb19f19db3b68777b5a94b89e07f66a (patch) | |
| tree | 554a8013776ebeae3e2976074020c09c2d1af8b0 /sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD | |
| parent | a7eb61ff7a09f39bee67014bf24b8919eaccfc19 (diff) | |
| download | BNW-e3f7237ffcb19f19db3b68777b5a94b89e07f66a.tar.gz | |
New parameter learning options
The main change here is in the parameter learning methods. The parameters that are learned at first (i.e., if there is no evidence) are the distributions that are found directly in the data. I had to create or significantly modify several BNT files for this. If there is evidence, the parameters are learned using a Dirichlet prior. This only required a couple of small changes to the BNW parameter learning files.
Diffstat (limited to 'sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD')
6 files changed, 54 insertions, 0 deletions
diff --git a/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/CPD_to_CPT_orig.m b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/CPD_to_CPT_orig.m new file mode 100644 index 00000000..707de900 --- /dev/null +++ b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/CPD_to_CPT_orig.m @@ -0,0 +1,5 @@ +function CPT = CPD_to_CPT_orig(CPD) +% CPD_TO_CPT Convert the discrete CPD to tabular form (tabular) +% CPT = CPD_to_CPT_orig(CPD) + +CPT = CPD.CPT_orig; diff --git a/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/CPD_to_CPT_orig.m~ b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/CPD_to_CPT_orig.m~ new file mode 100644 index 00000000..351f103c --- /dev/null +++ b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/CPD_to_CPT_orig.m~ @@ -0,0 +1,5 @@ +function CPT = CPD_to_CPT(CPD) +% CPD_TO_CPT Convert the discrete CPD to tabular form (tabular) +% CPT = CPD_to_CPT(CPD) + +CPT = CPD.CPT; diff --git a/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/get_field.m b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/get_field.m index ba233db9..5812330d 100644 --- a/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/get_field.m +++ b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/get_field.m @@ -10,6 +10,7 @@ function val = get_field(CPD, name) switch name case 'cpt', val = CPD.CPT; + case 'cpt_orig', val = CPD.CPT_orig; case 'counts', val = CPD.counts; otherwise, error(['invalid argument name ' name]); diff --git a/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/learn_params_orig.m b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/learn_params_orig.m new file mode 100644 index 00000000..c0948566 --- /dev/null +++ b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/learn_params_orig.m @@ -0,0 +1,20 @@ +function CPD = learn_params_orig(CPD,j,data,ns,cnodes) +% LEARN_PARAMS_ORIG +% Calculate the original distributions of the data. +% The original distributions are just the percentages of states in the +% data file. + +local_data = data(j, :); +nobs = size(local_data,2); +if iscell(local_data) + local_data = cell2num(local_data); +end +counts = compute_counts(local_data,ns(j)); +counts = counts/nobs; +switch CPD.prior_type + case 'none', CPD.CPT_orig = counts; +% case 'dirichlet', CPD.CPT = mk_stochastic(counts + CPD.dirichlet); +% I will use 'dirichlet' priors incorrectly here. + case 'dirichlet', CPD.CPT_orig = counts; + otherwise, error(['unrecognized prior ' CPD.prior_type]) +end diff --git a/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/learn_params_orig.m~ b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/learn_params_orig.m~ new file mode 100644 index 00000000..7a19a42d --- /dev/null +++ b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/learn_params_orig.m~ @@ -0,0 +1,20 @@ +function CPD = learn_params_orig(CPD,j,data,data,ns,cnodes) +% LEARN_PARAMS_ORIG +% Calculate the original distributions of the data. +% The original distributions are just the percentages of states in the +% data file. + +local_data = data(j, :); +nobs = size(local_data,2); +if iscell(local_data) + local_data = cell2num(local_data); +end +counts = compute_counts(local_data,ns(j)); +counts = counts/nobs; +switch CPD.prior_type + case 'none', CPD.CPT_orig = counts; +% case 'dirichlet', CPD.CPT = mk_stochastic(counts + CPD.dirichlet); +% I will use 'dirichlet' priors incorrectly here. + case 'dirichlet', CPD.CPT_orig = counts; + otherwise, error(['unrecognized prior ' CPD.prior_type]) +end diff --git a/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/tabular_CPD.m b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/tabular_CPD.m index 728302d4..a41a23d9 100644 --- a/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/tabular_CPD.m +++ b/sourcecodes/bnt-master/BNT/CPDs/@tabular_CPD/tabular_CPD.m @@ -9,6 +9,7 @@ function CPD = tabular_CPD(bnet, self, varargin) % - T means use table T; it will be reshaped to the size of node's family. % - 'rnd' creates rnd params (drawn from uniform) % - 'unif' creates a uniform distribution +% CPT_orig - specifies the distribution based on original data % adjustable - 0 means don't adjust the parameters during learning [1] % prior_type - defines type of prior ['none'] % - 'none' means do ML estimation @@ -60,6 +61,7 @@ CPD.sparse = 0; % set defaults CPD.CPT = mk_stochastic(myrand(fam_sz)); +CPD.CPT_orig = mk_stochastic(myrand(ns([self]))); CPD.adjustable = 1; CPD.prior_type = 'none'; dirichlet_type = 'BDeu'; @@ -158,6 +160,7 @@ function CPD = init_fields() % or create it from scratch. (Matlab requires this.) CPD.CPT = []; +CPD.CPT_orig = []; CPD.sizes = []; CPD.prior_type = []; CPD.dirichlet = []; |
