带序言的隐马尔可夫模型硬币和骰子示例

问题描述 投票:1回答:1

我从here得到了一个特定的问题,想在Cplint上实现,因为我正在学习ProbLog的原理

using the above HMM as an example

因此,从以上模型我们得到有六个侧面的红色骰子,标记为1到6。

•一个绿色的模具,具有十二个侧面,其中五个标记为2到6,而其余七个面标记为1。

•加权的红色硬币,其正面概率为0.9,概率为的尾巴是0.1。

•加权绿色硬币,其正面朝上的概率为0.95,并且尾巴的机率是0.05。

作为解决方案,我想用{以下规则:

•首先滚动红色骰子并写下出现的数字,即发射/观测。

•扔红硬币并执行以下操作之一:

➢如果结果为正面,则滚动红色骰子并记下结果。

➢如果结果是尾巴,则滚动绿色模具并记下结果。

•在随后的每个步骤中,您翻转与骰子颜色相同的硬币在上一步中滚动。如果硬币正面朝上,则滚动与前一步。如果硬币从尾巴出来,请切换到另一个骰子。

我的模型状态图有两个状态,红色和绿色,如数字。另外,该图显示:1)状态转换概率矩阵A,b)离散发射/观测概率矩阵B,以及3)初始(先验)概率矩阵π。该模型未隐藏,因为您知道状态顺序从硬币和骰子的颜色。但是,假设其他人正在产生排放/观测结果而没有显示骰子或硬币。您所看到的是发射/观测的顺序。如果您看到的数字比其他数字多1,则表示可能会怀疑模型处于绿色状态,但是您不确定,因为您无法看到正在滚动的模具的颜色。

考虑隐马尔可夫模型(HMM) M=(A, B, π),假设观察序列O=<1,1,2,2,3,6,1,1,1,3>是隐藏序列为

的概率
H =<RC,GC, GC,RC, RC,GC, GC,GC,GC,GC>

其中RC和GC分别代表Read Coin和Green Coin。使用cplint或ProbLog计算模型M生成序列的概率O。即,计算概率

P(H|O) = P(<RC,GC, GC,RC, RC,GC, GC,GC,
GC,GC>| <1,1,2,2,3,6,1,1,1,3>)

到目前为止,我所做的是两种方法。1)

:- use_module(library(pita)).

:- if(current_predicate(use_rendering/1)).
:- use_rendering(c3).
:- use_rendering(graphviz).
:- endif.

:- pita.

:- begin_lpad.

hmm(O):-hmm1(_,O).

hmm1(S,O):-hmm(q1,[],S,O).

hmm(end,S,S,[]).

hmm(Q,S0,S,[L|O]):-
    Q\= end,
    next_state(Q,Q1,S0),
    letter(Q,L,S0),
    hmm(Q1,[Q|S0],S,O).


next_state(q1,q1,S):0.9;
next_state(q1,q2,S):0.1.

next_state(q2,q1,S):0.05;
next_state(q2,q2,S):0.95.


letter(q1,rd1,S):1/6;
letter(q1,rd2,S):1/6;
letter(q1,rd3,S):1/6;
letter(q1,rd4,S):1/6;
letter(q1,rd5,S):1/6;
letter(q1,rd6,S):1/6.

letter(q2,gd1,S):7/12;
letter(q2,gd2,S):1/12;
letter(q2,gd3,S):1/12;
letter(q2,gd4,S):1/12;
letter(q2,gd5,S):1/12;
letter(q2,gd6,S):1/12.


:- end_lpad.

state_diagram(digraph(G)):-
    findall(edge(A -> B,[label=P]),
      (clause(next_state(A,B,_,_,_),
        (get_var_n(_,_,_,_,Probs,_),equalityc(_,_,N,_))),
        nth0(N,Probs,P)),
      G).

我创建图表的人

而第二个就是这个,我只创建了两个硬币和骰子。我不知道该如何继续。第一个是来自cplint的示例。我找不到为此类任务指定的任何其他论坛。好像problog是“死的”]

:- use_module(library(pita)).

:- if(current_predicate(use_rendering/1)).
:- use_rendering(c3).
:- endif.

:- pita.

:- begin_lpad.

heads(RC): 0.9; tails(RC) : 0.1:- toss(RC).
heads(GC): 0.95; tails(GC) : 0.05:- toss(GC).

toss(rc);

RD(0,1):1/6;RD(0,2):1/6;RD(0,3):1/6;RD(0,4):1/6;RD(0,5):1/6;RD(0,6):1/6.
RD(0,1):1/6;RD(0,2):1/6;RD(0,3):1/6;RD(0,4):1/6;RD(0,5):1/6;RD(0,6):1/6:-
    X1 is X-1,X1>=0,
    RD(X1,_),
    \+ RD(X1,6)

GD(0,1):1/12;GD(0,2):1/12;GD(0,3):1/12;GD(0,4):1/12;GD(0,5):1/12;GD(0,6):7/12.
GD(0,1):1/12;GD(0,2):1/12;GD(0,3):1/12;GD(0,4):1/12;GD(0,5):1/12;GD(0,6):7/12:-
    X1 is X1-1,X1>=0,
    GD(X1,_),
    \+ GD(X1,12).


toss(RC).
toss(GC).

:- end_lpad.
statistics prolog hidden-markov-models
1个回答
0
投票

hmmpos.pl来自here似乎足以继续进行下去]

© www.soinside.com 2019 - 2024. All rights reserved.