我有一个3D numpy数组,其中包含最后一个维度中每个类别的概率。例如:
import numpy as np
from scipy.special import softmax
array = np.random.normal(size=(10, 100, 5))
probabilities = softmax(array, axis=2)
字符串
我如何从具有这些概率的分类分布中抽样?
编辑:现在我是这样做的:
def categorical(x):
return np.random.multinomial(1, pvals=x)
samples = np.apply_along_axis(categorical, axis=2, arr=probabilities)
型
但它非常慢,所以我想知道是否有一种方法来矢量化这个操作。
2条答案
按热度按时间p8ekf7hl1#
从给定的概率分布中抽取样本是通过构建评估0到1范围内的随机数的逆累积分布来完成的。对于少数离散类别-如问题中-您可以使用线性搜索找到逆:
字符串
对于测试数据集,典型的测试输出为:
型
看起来没问题
如果你有很多很多的类别(上千个),最好使用numba编译函数进行二分搜索。
lokaqttq2#
您可以使用
np.random.choice
函数。它有一个方便的p
参数,允许您指定每个类别的概率。参见下面的工作示例字符串