我在使用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 )
像我说的那样,这个版本很慢。
由于我的所有代码都已完成,期望将表格表示为所描述的字典,因此我将更改表示表格的方式作为最后一个选项。
但如果它是优化表乘法的唯一方法,我会考虑它。
有没有人可以让我了解如何加快速度?
提前谢谢。
答案 0 :(得分:0)
在查看了一些实现之后,我明白了实现这一目标的最佳选择是使用矩阵。 基本上,我们不需要表示 P_ABC 和 P_ACD 的行,而只需要表示概率值。 然后,表的乘法可以通过将概率表乘以某个映射顺序来完成。