【问题标题】:Markov Chain: Finding terminal state calculation马尔可夫链:寻找终端状态计算
【发布时间】:2017-03-18 22:16:30
【问题描述】:

我正在尝试解决这个问题。希望有人能告诉我如何完成这个。我查阅了以下页面,但我无法在 java/python 中编写产生正确输出并通过所有测试用例的代码。我将不胜感激。

Markov chain probability calculation - Python

Calculating Markov chain probabilities with values too large to exponentiate

编写一个函数 answer(m) ,它接受一个非负整数数组,表示该状态进入下一个状态的次数,并为每个终端状态返回一个整数数组,给出每个终端状态的确切概率,表示为每个状态的分子,然后以最简单的形式表示所有状态的分母。该矩阵最多为 10 x 10。保证无论矿石处于哪种状态,都有一条从该状态到终端状态的路径。也就是说,处理将始终以稳定状态结束。矿石从状态 0 开始。在计算过程中,分母将适合带符号的 32 位整数,只要分数被定期简化。 例如,考虑矩阵 m:

[
[0,1,0,0,0,1],  # s0, the initial state, goes to s1 and s5 with equal    probability
[4,0,0,3,2,0],  # s1 can become s0, s3, or s4, but with different probabilities
[0,0,0,0,0,0],  # s2 is terminal, and unreachable (never observed in practice)
[0,0,0,0,0,0],  # s3 is terminal
[0,0,0,0,0,0],  # s4 is terminal
[0,0,0,0,0,0],  # s5 is terminal
]

    So, we can consider different paths to terminal states, such as:

    s0 -> s1 -> s3

    s0 -> s1 -> s0 -> s1 -> s0 -> s1 -> s4

    s0 -> s1 -> s0 -> s5

    Tracing the probabilities of each, we find that

    s2 has probability 0

    s3 has probability 3/14

    s4 has probability 1/7

    s5 has probability 9/14

【问题讨论】:

    标签: java python


    【解决方案1】:

    作为一种替代方法,可以考虑使用Engel's algorithm for absorbing Markov chains 来计算吸收概率。这不需要矩阵求逆/线性系统解,因此不需要有理数算术。

    【讨论】:

      【解决方案2】:

      我知道这是一个有点老的话题,但也许有人会感兴趣。

      就我而言,这个 PDF 对我帮助很大:https://math.dartmouth.edu/archive/m20x06/public_html/Lecture14.pdf

      该算法易于实现。

      正如安娜所说,您需要对矩阵进行排序,请记住同时对行和列进行排序以获得正确的结果。

      关于边缘情况:

      • 如果您从唯一的一个状态开始,1x1 始终为 100%,并且它必须终止,因为没有其他状态。

      • 如果只有一个非终结状态,则结果将与这一行相同。无需计算。

      安娜回答的最后两个边缘案例(我认为应该接受)不是边缘案例,坦率地说,它们是常规案例,因此您需要正常计算答案。

      【讨论】:

        【解决方案3】:

        我不确定边缘情况的结果应该是什么,但我为这个问题所做的是:

        1. 通过将每行中的所有分子相加,创建了第二个矩阵,该矩阵包含每个概率的所有分母。
        2. 在矩阵中找到第一个终端状态以用作非终端状态的边界。
        3. 从相同大小的单位矩阵中减去以第一个终端为界的矩阵。
        4. 求差的倒数。有几种方法可以做到这一点,我决定用差异来增加匹配的单位矩阵。
        5. 将逆矩阵乘以从第一个端点到矩阵末尾的矩阵。
        6. 然后,找到结果分母并返回从第一个终端到矩阵末尾的矩阵的第一行分子。

        旁注:

        • 您需要编写一个简化分数的简化函数(您可能还需要编写 gcf 和 lcm 函数来帮助您简化)。
        • 您可能还需要对矩阵进行排序,使终端位于矩阵的末尾,从而使其格式正确。
        • 边缘情况:1x1 矩阵,只有 1 个非终结状态的矩阵,10x10 矩阵,只有 1 个终结状态的矩阵

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-06
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多