【发布时间】:2015-03-24 22:15:43
【问题描述】:
我在 Python 中使用字典实现概率表的乘法时遇到了麻烦。 我真的不想要最优化的代码,但问题是我所做的实现太慢了,一个简单的乘法序列可能需要几个小时。
这是目前的情况。 概率表是一个字典,其中键是其配置的元组,值是概率值。 例如,考虑将两个概率表P(A,B,C)和P(A,C,D)相乘,其中A, 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 )
就像我说的,这个版本很慢。 由于我的所有代码都在期望表格被表示为所描述的字典的情况下完成,所以我将更改我表示表格的方式作为最后一个选项。 但如果这是优化表乘法的唯一方法,我会考虑。
有人可以告诉我如何加快速度吗?
提前谢谢你。
【问题讨论】:
标签: python optimization dictionary probability multiplication