python - 具有不同概率的向量化 np.random.choice
问题描述
我已经使用 sklearn 训练了一个机器学习模型,并希望通过根据 predict_proba 概率对预测进行采样来模拟结果。所以我想做类似的事情
samples = np.random.choice(a = possible_outcomes, size = (n_data, n_samples), p = probabilities)
Where probabilities would be is an (n_data, n_possible_outcomes) array
但是 np.random.choice 只允许 p 参数使用一维数组。我目前已经使用类似于以下实现的 for 循环解决了这个问题
sample_outcomes = np.zeros((len(probs), n_samples))
for i in trange(len(probs)):
sample_outcomes[i, :] = np.random.choice(outcomes, s = n_samples, p=probs[i])
但这相对较慢。任何加快速度的建议将不胜感激!
解决方案
如果我理解正确,您需要一种向量化的方式来 多次应用选择,并且每次都使用不同的概率向量。您可以按如下方式手动实现:
import numpy as np
# for reproducibility
np.random.seed(42)
# number of samples
k = 5
# possible outcomes
outcomes = np.arange(10)
# generate a random probability matrix for 15 runs
probabilities = np.random.random((15, 10))
probs = probabilities / probabilities.sum(1)[:, None]
# generate the choices by picking those probabilities above a random generated number
# the higher the value in probs the higher the probability to pick it
choices = probs - np.random.random((15, 10))
# to pick the top k using argpartition need to multiply by -1
choices = -1 * choices
# pick the top k values
res = outcomes[np.argpartition(choices, k, axis=1)][:, :k]
# flatten to match the expected output
print(res.flatten())
输出
[1 8 2 5 3 6 4 8 7 0 1 5 9 3 7 1 4 9 0 8 5 0 4 3 6 8 5 1 2 6 5 3 2 0 6 5 4
2 3 7 7 9 4 6 1 3 6 4 2 1 4 9 3 0 1 6 9 2 3 8 5 4 7 6 1 5 3 8 2 1 1 0 9 7
4]
在上面的示例中,代码k
从 10 ( ) 个总体中抽取 5 ( ) 个元素,outcomes
每次 15 次使用不同的概率向量(probs
形状为 15 x 10)。
推荐阅读
- css - 试图向我的 CSS 添加代码但它不起作用
- function - Fortran 函数返回可分配数组
- windows-subsystem-for-linux - 在目录中打开 wsltty
- c# - 这是n加1的问题吗?单个请求中的多个 DbContext 调用
- c# - 我的 UserControl 中的 DependencyProperty 设置和回调没有发生
- python - &/| 的结果 两个数之间的运算符
- ios - 如何使用 Objective-C 制作自定义完成处理程序
- python - 使用 Pygame 自行移动对象
- sql - 根据地址相似性查找示例
- paypal - Paypal 计费计划和计费协议