Я пытаюсь реализовать наивный байесовский классификатор, используя BNT и MATLAB. До сих пор я придерживался простых tabular_CPD
переменных и «угадывал» вероятности для переменных. Мой прототип сети на данный момент состоит из следующего:
DAG = false(5);
DAG(1, 2:5) = true;
bnet = mk_bnet(DAG, [2 3 4 3 3]);
bnet.CPD{1} = tabular_CPD(bnet, 1, [.5 .5]);
bnet.CPD{2} = tabular_CPD(bnet, 2, [.1 .345 .45 .355 .45 .3]);
bnet.CPD{3} = tabular_CPD(bnet, 3, [.2 .02 .59 .2 .2 .39 .01 .39]);
bnet.CPD{4} = tabular_CPD(bnet, 4, [.4 .33333 .5 .33333 .1 .33333]);
bnet.CPD{5} = tabular_CPD(bnet, 5, [.5 .33333 .4 .33333 .1 .33333]);
engine = jtree_inf_engine(bnet);
Здесь переменная 1 — это моя желаемая выходная переменная, установленная для первоначального присвоения вероятности 0,5 любому выходному классу.
Переменные 2-5 определяют CPD для функций, которые я измеряю:
- 2 — размер кластера от 1 до дюжины и более
- 3 - это соотношение, которое будет реальным значением >= 1
- 4 и 5 — значения стандартного отклонения (реальные) (разброс по осям X и Y).
Чтобы классифицировать кластер-кандидат, я разбиваю все измерения функций на 3-4 скобки диапазона, например так:
...
evidence = cell(1, 5);
evidence{2} = sum(M > [0 2 6]);
evidence{3} = sum(O > [0 1.57 2 3]);
evidence{4} = sum(S(1) > [-Inf 1 2]);
evidence{5} = sum(S(2) > [-Inf 0.4 0.8]);
eng = enter_evidence(engine, evidence);
marginals = marginal_nodes(eng, 1);
e = marginals.T(1);
...
На самом деле это работает очень хорошо, учитывая, что я только догадываюсь о диапазонах и значениях вероятности. Но я считаю, что следует использовать здесь gaussian_CPD
. Я думаю, что gaussian_CPD
может выучить как оптимальные скобки, так и вероятности (как средние и ковариационные матрицы и веса).
Моя проблема в том, что я не нашел простых примеров использования класса BNT gaussian_CPD
. Как, например, мне инициализировать gaussian_CPD
примерно таким же поведением, как одна из моих переменных tabular_CPD
выше?