我在Python中使用dictionary实现概率表乘法时遇到问题。我真的不想要最优化的代码,但问题是我所做的实现太慢了,一个简单的乘法序列可能需要几个小时。
以下是目前的情况。概率表是一种字典,其中键是其配置的元组,值是概率值。例如,考虑乘以两个概率表P(A,B,C)和P(A,C,D)、B,C以及D是二进制变量(例如,域{true、false})。首先,这两个表都用字典表示:
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 )
就像我说的,这个版本非常慢。由于我所有的代码都是期望将表表示为所描述的字典,所以我将更改表的表示方式作为最后一个选项。但如果这是优化表乘法的唯一方法,我会考虑它
有人能告诉我如何加快速度吗?
提前谢谢。
在查看了一些实现后,我了解到快速实现的最佳选择是使用矩阵。基本上,我们不需要表示P_ABC和P_ACD的行,而只需要表示概率值。然后,可以通过按特定映射顺序乘以概率表来完成表的乘法运算。