4

我正在寻找一种在 python 中存储和使用条件概率的好方法。

我正在考虑使用pandas数据框。如果某些条件概率XP(X=A|P1=1, P2=1) = 0.2P(X=B|P1=2, P2=1) = 0.9,我会使用数据框

         A    B
P1 P2          
1  1   0.2  0.8
   2   0.5  0.5
2  1   0.9  0.1
   2   0.9  0.1

P1并给定和P2作为系列的边际概率

1    0.4
2    0.6
Name: P1

1    0.7
2    0.3
Name: P2

我想获得 的边际概率系列X,即系列

A    0.602
B    0.398
Name: X

我可以得到我想要的

X = sum(
    sum(
        X.xs(i, level="P1")*P1[i]
        for i in P1.index
        ).xs(j)*P2[j]
    for j in P2.index
    )
X.name="X"

但这并不容易推广到更多的依赖项,第一个xslevel和第二个没有之间的不对称看起来很奇怪,并且在使用时像往常一样pandas我非常确定使用它的技巧和方法会有更好的解决方案。

pandas一个很好的工具,我是否应该以另一种方式表示我的数据,以及进行此计算的最佳方法是什么,它本质上是一个索引张量积,在pandas

4

1 回答 1

0

向量化的一种方法是通过使用标签数组进行索引来访问系列 P1 和 P2 中的值。

In [20]: df = X.reset_index()

In [21]: mP1 = P1[df.P1].values

In [22]: mP2 = P2[df.P2].values

In [23]: mP1
Out[23]: array([ 0.4,  0.4,  0.6,  0.6])

In [24]: mP2
Out[24]: array([ 0.7,  0.3,  0.7,  0.3])

In [25]: mp = mP1 * mP2

In [26]: mp
Out[26]: array([ 0.28,  0.12,  0.42,  0.18])

In [27]: X.mul(mp, axis=0)
Out[27]: 
       A      B
P1 P2              
1  1   0.056  0.224
   2   0.060  0.060
2  1   0.378  0.042
   2   0.162  0.018

In [28]: X.mul(mp, axis=0).sum()
Out[28]: 
A    0.656
B    0.344

In [29]: sum(
    sum(
    X.xs(i, level="P1")*P1[i]
    for i in P1.index
    ).xs(j)*P2[j]
    for j in P2.index
    )
Out[29]: 
A    0.656
B    0.344

(或者,在不重置索引的情况下访问 MultiIndex 的值,如下所示。)

In [38]: P1[X.index.get_level_values("P1")].values
Out[38]: array([ 0.4,  0.4,  0.6,  0.6])
于 2012-12-28T08:24:23.600 回答