如何在Python中使用字典优化概率表的乘法?

时间:2015-03-24 22:15:44

标签: python optimization dictionary probability multiplication

我在使用Python中的字典实现概率表的乘法时遇到了麻烦。 我真的不想要最优化的代码,但问题是我所做的实现是如此之慢,以至于可能需要数小时来进行简单的乘法序列。

目前的情况如下。 概率表是一个字典,其中键是其配置的元组,值是概率值。 例如,考虑将两个概率表 P(A,B,C) P(A,C,D)相乘,其中 A B C D 是二进制变量(例如,域{ true false < / EM>})。 首先,两个表都由字典表示:

P_ABC = { (false,false,true):  0.01,
          (false,true,false):  0.05,
          (true,false,false):  0.10,
          (false,true,true):   0.05,
          (true,true,false):   0.05,
          (true,false,true):   0.05,
          (true,true,true):    0.30,
          (false,false,false): 0.39 }

P_ACD = { (false,false,true):  0.01,
          (false,true,false):  0.05,
          (true,false,false):  0.10,
          (false,true,true):   0.05,
          (true,true,false):   0.05,
          (true,false,true):   0.05,
          (true,true,true):    0.30,
          (false,false,false): 0.39 }

接下来,我在列表中保存两个表的公共变量的索引:

matchingIndexes = [(0,0),(2,1)]

其中元组中的第一个值是第一个表,第二个值是第二个表。 在我们的运行示例中,此列表可以解释为两个表共有的两个变量,即 A C A 位于第一个表格中的第一个位置(索引0)以及第二个表格中。 另一方面, C 位于第一个表中的第三个位置(索引2),但位于第二个表中的第二个位置(索引1)。

鉴于此,我的下一步是执行乘法。 但是,如果所有匹配变量(表的列)具有相同的域值,我只会乘以一行。 遵循我提出的算法:

results = []
for row1 in P_ABC:
            for row2 in P_ACD:
                flag = True
                for ind in matchingIndexes:
                    flag = flag and (row1[ind[0]] == row2[ind[1]])
                if flag:
                    mult = P_ABC[row1] * P_ACD[row2]
                    results.append( mult )
像我说的那样,这个版本很慢。 由于我的所有代码都已完成,期望将表格表示为所描述的字典,因此我将更改表示表格的方式作为最后一个选项。 但如果它是优化表乘法的唯一方法,我会考虑它。

有没有人可以让我了解如何加快速度?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

在查看了一些实现之后,我明白了实现这一目标的最佳选择是使用矩阵。 基本上,我们不需要表示 P_ABC P_ACD 的行,而只需要表示概率值。 然后,表的乘法可以通过将概率表乘以某个映射顺序来完成。