pymc3, как кодировать дискретную байесовскую сеть CPT с несколькими состояниями?

Я пытаюсь построить простую байесовскую сеть, в которой дождь и разбрызгиватель являются родителями мокрой травы, но у каждого дождя и разбрызгивателя по три состояния (тип нечеткой логики, а не два обычных логических), а у мокрой травы два состояния (истина). /ЛОЖЬ). Я нигде не могу найти в документах pymc3, какой синтаксис использовать для описания CPT для этого - я пытаюсь сделать следующее на основе примеров с двумя состояниями, но это не обобщает три состояния, как я думал. Может ли кто-нибудь показать правильный способ сделать это? (А также для более общего случая, когда мокрая трава тоже имеет три состояния.)

rain = mc.Categorical('rain', p = np.array([0.5, 0. ,0.5]))   

sprinker = mc.Categorical('sprinkler', p=np.array([0.33,0.33,0.34]))  

wetgrass = mc.Categorical('wetgrass',
    mc.math.switch(rain,
        mc.math.switch(sprinker, 10, 1, -4),
        mc.math.switch(sprinker, -20, 1, 3),
        mc.math.switch(sprinker, -5, 1, -0.5)))

[выдает ошибку при определении мокрой травы: неправильное количество входных данных для Switch.make_node (получено 4 ((, , , )), ожидается 3)]

Насколько я понимаю, переключатель - это теано-функция, аналогичная (b?a:b) в программе на C; который выполняет только двухстороннее сравнение. Возможно, можно настроить CPT, используя целую кучу таких бинарных переключателей, но я действительно хочу просто дать 3D-матричный CPT в качестве входных данных, как в BNT и других библиотеках байесовских сетей. Возможно ли это в настоящее время?


person charles.fox    schedule 21.04.2017    source источник


Ответы (1)


Вы можете закодировать трехпозиционный переключатель, используя два отдельных переключателя:

tt.switch(sprinker == 0,
    10
    tt.switch(sprinker == 1, 1, -4))

Но в целом, вероятно, лучше индексировать в таблицу:

table = tt.constant(np.array([[...], [...]]))
value = table[rain, sprinker]
person aseyboldt    schedule 21.04.2017
comment
Спасибо - это работает для определения сети, однако у меня возникли проблемы с выполнением выборки и вычислений logp - хотя я задам это как отдельный вопрос сейчас. - person charles.fox; 21.04.2017
comment
Новый вопрос и рабочий код, включая ответ aseyboldt на этот вопрос, находятся здесь: stackoverflow.com/questions/43540977/ - person charles.fox; 21.04.2017