2012-11-22 55 views
0

我正在研究贝叶斯概率项目,我需要根据新信息调整概率。我还没有找到一个有效的方法来做到这一点。我试图做的是以不同场景的等概率列表开始。防爆。 有6人:E,T,M,Q,L和Z,并且被选择在一个人在第一第三字母顺序具有集体Python列表重新排序,记得原来的顺序?

myList=[.1667, .1667, .1667, .1667, .1667, .1667] 

新的信息面表示的其初始相应概率70%的机会被选中。新名单按名称(E,L,M,Q,T,Z)按字母顺序排列,只包含新信息。 (0.7/0.333 = 2.33,0.3/0.667 = 0.45)

newList=[2.33, 2.33, .45, .45, .45, .45) 

我需要一种方法来订购newList作为myList中,所以我可以在乘以列表解析正确的价值观,并达到相同的调整概率。有一个单一的一致的顺序很重要,因为这个过程会重复多次,每个都有不同的标准(元音,最接近P等),并且列表中有大约1000个项目。 每个newList可以改为newDictionary,然后一旦创建了调整条件,就可以将它们排序到列表中,但转换多个字典似乎效率低下。是吗?有没有简单的方法来做到这一点我完全失踪?

谢谢!

+1

这似乎是一个不成熟优化的经典案例:担心你描述的那种低效率;它只是无关紧要。 – Petri

+0

注意。我仍然是一个相对的初学者,所以我不确定效率,看起来好像字典里的有序列表转换可能会很慢。知道这不是什么大问题,令人放心。 – sybaritic

回答

0

尝试存储您的信息作为元组的列表:

bayesList = [('E', 0.1667), ('M', 0.1667), ...] 

列表理解可以沿

newBayes = [(person, prob * normalizeFactor) for person, prob in bayesList] 

你到哪儿去normalizeFactor线路设置您的列表理解之前计算

+0

那么我如何指定normalizeFactor来确保它是正确的呢?元组的另一个列表?对于这个问题,如果我使用两个元组列表,使用两组元组会比列表更有效率吗? – sybaritic

+0

@ user1816773:再次担心优化之前,甚至工作。首先做到这一点,看看它有多快,然后在必要时加快速度。 – martineau

+0

normalizeFactor = sum([prob for person,prob in bayesList]),或者当你计算你的新信息时你可以计算/追踪它 – user1245262

1

对于什么是值得的,你可以用Python的方法加速你的方法,最好的办法是使用numpy而不是标准类型(因此,编译C代码来执行算术运算)。这将导致戏剧性的速度增加。无论如何,Numpy数组有固定的顺序,语法更直接适用于数学运算。您只需要考虑如何将操作表达为矩阵操作。例如。你的例子:

myList = np.ones(6)/6. 
newInfo = np.array([.7/2, .7/2, .3/4, .3/4, .3/4, .3/4]) 
result = myList * newInfo 

由于两个矢量有单位和有没有必要进行规范化(我不知道你在你的例子在做什么,我承认,所以如果有我错过了微妙让我知道),但如果你确实需要它很简单:

result /= np.sum(result)