使用pandas.DataFrame进行概率张量乘法

时间:2012-12-26 17:28:37

标签: python statistics pandas probability matrix-multiplication

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

我正在考虑使用pandas数据框。如果某些X的条件概率为P(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

并给出P1P2作为系列

的边际概率
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中进行此计算的最佳方法是什么,这实际上是一个索引张量积?

1 个答案:

答案 0 :(得分: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])