首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PyTorch:如何从张量中的每个值都有不同的可能被选择的张量中取样?

PyTorch:如何从张量中的每个值都有不同的可能被选择的张量中取样?
EN

Stack Overflow用户
提问于 2022-06-01 19:23:07
回答 3查看 791关注 0票数 1

给定包含求和为1的概率的张量A = torch.tensor([0.0316, 0.2338, 0.2338, 0.2338, 0.0316, 0.0316, 0.0860, 0.0316, 0.0860]) (我去掉了一些小数,但可以安全地假定它总是求和为1),我想从A中采样一个值,其中值本身就是被采样的可能性。例如,从0.0316中抽取A的可能性是0.0316。抽样值的输出仍应是张量。

我尝试使用WeightedRandomSampler,但它不再允许选择的值作为张量,而是分离。

有一点需要注意的是,我也想知道样本值的指数,因为它出现在张量中。也就是说,假设我是样本0.2338,我想知道它是指数12还是张量A3

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-03 10:04:53

通过累加权值和选择随机浮点数[0,1)的插入指数,可以实现具有期望概率的选择。示例数组A被稍加调整为1。

代码语言:javascript
运行
复制
import torch

A = torch.tensor([0.0316, 0.2338, 0.2338, 0.2338, 0.0316, 0.0316, 0.0860, 0.0316, 0.0862], requires_grad=True)

p = A.cumsum(0)
#tensor([0.0316, 0.2654, 0.4992, 0.7330, 0.7646, 0.7962, 0.8822, 0.9138, 1.0000], grad_fn=<CumsumBackward0>))

idx = torch.searchsorted(p, torch.rand(1))
A[idx], idx

输出

代码语言:javascript
运行
复制
(tensor([0.2338], grad_fn=<IndexBackward0>), tensor([3]))

这比使用A.multinomial(1)的更常见的方法要快。

抽样10000倍于一个元素以检查分布是否符合概率

代码语言:javascript
运行
复制
from collections import Counter

Counter(int(A.multinomial(1)) for _ in range(10000))
#1 loop, best of 5: 233 ms per loop

# vs @HatemAli's solution
dist=torch.distributions.categorical.Categorical(probs=A)
Counter(int(dist.sample()) for _ in range(10000))
# 10 loops, best of 5: 107 ms per loop

Counter(int(torch.searchsorted(p, torch.rand(1))) for _ in range(10000))
# 10 loops, best of 5: 53.2 ms per loop

输出

代码语言:javascript
运行
复制
Counter({0: 319,
         1: 2360,
         2: 2321,
         3: 2319,
         4: 330,
         5: 299,
         6: 903,
         7: 298,
         8: 851})
票数 2
EN

Stack Overflow用户

发布于 2022-06-01 22:55:17

这个怎么样?

代码语言:javascript
运行
复制
probs = torch.tensor([0.0316, 0.2338, 0.2338, 0.2338, 0.0316, 0.0316, 0.0860, 0.0316, 0.0860],requires_grad=True)

dist=torch.distributions.categorical.Categorical(probs=probs)
probs[dist.sample()]
票数 1
EN

Stack Overflow用户

发布于 2022-06-01 19:29:15

你可以通过做这样的事情来作弊:

代码语言:javascript
运行
复制
A = A*10000
temp = [[i]*A[i] for i in range(len(A))]
value = np.random.choice(temp)/10000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72467096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档