WEKA: Как получить значения CPT для каждого узла в BayesNet?

Я использую BayesNet и SimpleEstimator без присмотра и ищу совместное распространение сети. Я знаю это, используя следующее:

BayesNet bn=new BayesNet();
...
SimpleEstimator sbne = new SimpleEstimator();
sbne.estimateCPTs(bn);
...
distributionForInstance(bn,testingsource.instance( i ))

Мы получим таблицу условной вероятности (CPT) индекса класса, например i. Однако я не знаю, как получить (CPT) для каждого другого узла (в дополнение к индексу класса).

Одним из способов было бы рекурсивное изменение индекса класса и повторный вызов этой функции, но это было бы очень неэффективно.

Я был бы очень благодарен, если бы вы помогли мне получить расчетный CPT для каждого другого узла.


person Boshra N    schedule 06.03.2015    source источник


Ответы (1)


Попробуйте метод getProbability в классе BayesNet. Вот что я делаю.

for(int i = 0; i < bnet.getCardinality(nodeIndex); i++)
      {
        System.out.print(bnet.getNodeValue(nodeIndex, i) + " = " + bnet.getProbability(nodeIndex, row, i) + " ");
      }

Где row равен 0 ‹= row ‹ bnet.getParentCardinality() и каждое значение row соответствует одной комбинации выходных символов родителя.

Таким образом, если у вашего узла 2 родителя, и каждый родитель выводит 2 символа, то у вас будет 0 ‹= строка ‹ 4 (2 родителя x 2 символа)

row = 0 соответствует комбинации 0,0 // значение символа с индексом 0 для родителя с индексом 0 и значение символа с индексом 0 для родителя с индексом 1

строка = 1 соответствует комбинации 0,1

row = 2 соответствует комбинации 1,0 // значение символа в индексе 1 родителя 0 и так далее.

строка = 3 соответствует комбинации 1,1


Вот пример вывода

----- Узел --------------

Имя: TuberculosisOrCancer родители: 2 : LungCancer Tuberculosis

Количество значений, которые может принимать узел: 2

[0] = да // индекс и значение

[1] = нет // индекс и значение

Распределения ---

Когда Рак легких = да, Туберкулез = нет

да = 0,9990990990990991 нет = 9,009009009009009E-4

Когда Рак легких = да, Туберкулез = да

да = 0,9444444444444444 нет = 0,05555555555555555

Когда Рак легких = нет, Туберкулез = нет

да = 5,3475935828877E-5 нет = 0,9999465240641712

Когда Рак легких = нет, Туберкулез = да

да = 0,9944444444444445 нет = 0,005555555555555556

person user1026267    schedule 19.03.2015
comment
Извините, но где код для второй половины вывода? - person Zhongjun 'Mark' Jin; 24.11.2018
comment
@ Чжунцзюнь'Марк'Джин . Извините, вход после очень долгого времени. - person user1026267; 29.10.2020