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



我在Python中使用dictionary实现概率表乘法时遇到问题。我真的不想要最优化的代码,但问题是我所做的实现太慢了,一个简单的乘法序列可能需要几个小时。

以下是目前的情况。概率表是一种字典,其中键是其配置的元组,值是概率值。例如,考虑乘以两个概率表P(A,B,C)P(A,C,D)BC以及D是二进制变量(例如,域{truefalse})。首先,这两个表都用字典表示:

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)]

其中元组中的第一个值是第一个表,第二个值是第二个表。在我们的运行示例中,此列表可以解释为两个表共有两个变量,即ACA位于第一个表的第一个位置(索引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 )

就像我说的,这个版本非常慢。由于我所有的代码都是期望将表表示为所描述的字典,所以我将更改表的表示方式作为最后一个选项。但如果这是优化表乘法的唯一方法,我会考虑它

有人能告诉我如何加快速度吗?

提前谢谢。

在查看了一些实现后,我了解到快速实现的最佳选择是使用矩阵。基本上,我们不需要表示P_ABCP_ACD的行,而只需要表示概率值。然后,可以通过按特定映射顺序乘以概率表来完成表的乘法运算。

最新更新