我正在寻找一种在python中存储和使用条件概率的好方法。
我正在考虑使用pandas
数据框。如果某些X
的条件概率为P(X=A|P1=1, P2=1) = 0.2
,P(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"
但这并不容易推广到更多的依赖关系,第一个xs
与level
之间的不对称与第二个之间的不对称看起来并不奇怪,而且在使用pandas
时我一如既往非常肯定使用它的技巧和方法有更好的解决方案。
pandas
是否是一个很好的工具,我应该用另一种方式表示我的数据,以及在pandas
中进行此计算的最佳方法是什么,这实际上是一个索引张量积?
答案 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])