【问题标题】:Probability tensor multiplication using pandas.DataFrame使用 pandas.DataFrame 的概率张量乘法
【发布时间】:2012-12-12 05:03:14
【问题描述】:

我正在寻找一种在 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 中进行这个计算的最佳方式是什么,这本质上是一个索引张量积?

【问题讨论】:

    标签: python statistics pandas probability matrix-multiplication


    【解决方案1】:

    矢量化的一种方法是通过使用标签数组进行索引来访问系列 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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2017-08-21
      • 2018-03-25
      相关资源
      最近更新 更多