如何将numpy random.choice应用于概率值矩阵(矢量化解决方案)

bfnvny8b  于 2023-02-04  发布在  其他
关注(0)|答案(2)|浏览(128)

我遇到的问题如下
我有一个包含3个值的整数(或np.array)的一维列表

l = [0,1,2]

我有一个二维概率列表(为了简单起见,我们使用两行)

P = 
[[0.8, 0.1, 0.1],
 [0.3, 0.3, 0.4]]

我需要的是numpy.random.choice(a=l, p=P),其中P(概率分布)中的每一行都应用于l。因此,我需要从[0,1,2]中抽取一个随机样本,首先是概率分布[0.8,0.1,0.1],然后是概率分布[0.3,0.3,0.4],这样就给予了两个输出。
=====更新=====
我可以使用for循环或列表解析,但我正在寻找一个快速/矢量化的解决方案。

qeeaahzv

qeeaahzv1#

有一个办法。
下面是概率的数组:

In [161]: p
Out[161]: 
array([[ 0.8 ,  0.1 ,  0.1 ],
       [ 0.3 ,  0.3 ,  0.4 ],
       [ 0.25,  0.5 ,  0.25]])

c保存累积分布:

In [162]: c = p.cumsum(axis=1)

生成一组均匀分布的样本...

In [163]: u = np.random.rand(len(c), 1)

...然后查看它们在c中的"位置":

In [164]: choices = (u < c).argmax(axis=1)

In [165]: choices
Out[165]: array([1, 2, 2])
mec1mxoz

mec1mxoz2#

这个问题已经很老了,但是基于这个问题可能有一个稍微优雅一点的解决方案:https://numpy.org/doc/stable/reference/random/generated/numpy.random.Generator.multinomial.html
(我修改了原始输入以用作DataFrame)。

# Define the list of choices
choices = ["a", "b", "c"]

# Define the DataFrame of probability distributions
# (In each row, the probabilities of a, b and c can be different)
df_probabilities = pd.DataFrame(data=[[0.8, 0.1, 0.1],
                                      [0.3, 0.3, 0.4]],
                                columns=choices)
print(df)
     a    b    c
0  0.8  0.1  0.1
1  0.3  0.3  0.4

# Generate a DataFrame of selections. In each row, a 1 denotes
# which choice was selected
rng = np.random.default_rng(42)
df_selections = pd.DataFrame(
    data=rng.multinomial(n=1, pvals=df_probabilities),
    columns=choices)

print(df_selections)
   a  b  c
0  1  0  0
1  0  1  0

# Finally, reduce the DataFrame to one column (actually pd.Series)
# with the selected choice
df_result = df_selections.idxmax(axis=1)
print(df_result)
0    a
1    b
dtype: object

相关问题