To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / _FullBNT / BNT / CPDs / @noisyor_CPD / noisyor_CPD.m @ 8:b5b38998ef3b
History | View | Annotate | Download (2.09 KB)
| 1 |
function CPD = noisyor_CPD(bnet, self, leak_inhibit, inhibit) |
|---|---|
| 2 |
% NOISYOR_CPD Make a noisy-or CPD |
| 3 |
% CPD = NOISYOR_CPD(BNET, NODE_NUM, LEAK_INHIBIT, INHIBIT) |
| 4 |
% |
| 5 |
% A noisy-or node turns on if any of its parents are on, provided they are not inhibited. |
| 6 |
% The prob. that the i'th parent gets inhibited (flipped from 1 to 0) is inhibit(i). |
| 7 |
% The prob that the leak node (a dummy parent that is always on) gets inhibit is leak_inhibit. |
| 8 |
% These params default to random values if omitted. |
| 9 |
% |
| 10 |
% Example: suppose C has parents A and B, and the |
| 11 |
% link of A->C fails with prob pA and the link B->C fails with pB. |
| 12 |
% Then the noisy-OR gate defines the following distribution |
| 13 |
% |
| 14 |
% A B P(C=0) |
| 15 |
% 0 0 1.0 |
| 16 |
% 1 0 pA |
| 17 |
% 0 1 pB |
| 18 |
% 1 1 pA * PB |
| 19 |
% |
| 20 |
% Currently, learning is not supported for noisy-or nodes |
| 21 |
% (since the M step is somewhat complicated). |
| 22 |
% |
| 23 |
% For simple generalizations of the noisy-OR model, see e.g., |
| 24 |
% - Srinivas, "A generalization of the noisy-OR model", UAI 93 |
| 25 |
% - Meek and Heckerman, "Learning Causal interaction models", UAI 97. |
| 26 |
|
| 27 |
|
| 28 |
|
| 29 |
if nargin==0 |
| 30 |
% This occurs if we are trying to load an object from a file. |
| 31 |
CPD = init_fields; |
| 32 |
CPD = class(CPD, 'noisyor_CPD', discrete_CPD(1, [])); |
| 33 |
return; |
| 34 |
elseif isa(bnet, 'noisyor_CPD') |
| 35 |
% This might occur if we are copying an object. |
| 36 |
CPD = bnet; |
| 37 |
return; |
| 38 |
end |
| 39 |
CPD = init_fields; |
| 40 |
|
| 41 |
|
| 42 |
ps = parents(bnet.dag, self); |
| 43 |
fam = [ps self]; |
| 44 |
ns = bnet.node_sizes; |
| 45 |
assert(all(ns(fam)==2)); |
| 46 |
assert(isempty(myintersect(fam, bnet.cnodes))); |
| 47 |
|
| 48 |
if nargin < 3, leak_inhibit = rand(1, 1); end |
| 49 |
if nargin < 4, inhibit = rand(1, length(ps)); end |
| 50 |
|
| 51 |
CPD.self = self; |
| 52 |
CPD.inhibit = inhibit; |
| 53 |
CPD.leak_inhibit = leak_inhibit; |
| 54 |
|
| 55 |
|
| 56 |
% For BIC |
| 57 |
CPD.nparams = 0; |
| 58 |
CPD.nsamples = 0; |
| 59 |
|
| 60 |
CPD.CPT = []; % cached copy, to speed up CPD_to_CPT |
| 61 |
|
| 62 |
clamped = 1; |
| 63 |
CPD = class(CPD, 'noisyor_CPD', discrete_CPD(clamped, ns([ps self]))); |
| 64 |
|
| 65 |
|
| 66 |
|
| 67 |
%%%%%%%%%%% |
| 68 |
|
| 69 |
function CPD = init_fields() |
| 70 |
% This ensures we define the fields in the same order |
| 71 |
% no matter whether we load an object from a file, |
| 72 |
% or create it from scratch. (Matlab requires this.) |
| 73 |
|
| 74 |
CPD.self = []; |
| 75 |
CPD.inhibit = []; |
| 76 |
CPD.leak_inhibit = []; |
| 77 |
CPD.nparams = []; |
| 78 |
CPD.nsamples = []; |
| 79 |
CPD.CPT = []; |