【问题标题】:Generate random vectors with a given (numerical) distribution matrix [duplicate]生成具有给定(数字)分布矩阵的随机向量
【发布时间】:2020-09-18 01:51:14
【问题描述】:

我正在尝试提出一种从分布矩阵生成随机向量的快速而智能的方法,就像这里讨论的那样: Generate random numbers with a given (numerical) distribution

但关键区别在于我有一个分布矩阵,而不仅仅是一个向量。

现在显然我可以创建一个 for 循环并循环遍历矩阵中的每个向量,但这似乎不是很 Python 或快速,所以我有点希望有更好的方法。

举一个我想要做的简单例子: 给定一个概率矩阵

p = [[0.2, 0.4, 0.4],[0.1, 0.7, 0.2],[0.44, 0.5, 0.06],...]

我希望绘制元素,其中每个元素都以概率矩阵中的概率被选中。 (基本上我想从我的单概率矩阵生成单热编码)。 例如,考虑到上述概率,它可能看起来像这样:

t = [2,1,2,...]

我需要为长序列执行此操作,并且我需要执行数百万次,但每个序列每次只执行 1 次。 (深度学习的数据增强)

有人有好的方法吗?

【问题讨论】:

  • 我认为这行得通!谢谢

标签: python numpy optimization pytorch


【解决方案1】:

您可以使用逆变换采样。计算 p 矩阵上的累积分布,对矩阵高度大小的单个随机向量进行采样,然后沿累积矩阵的每一行返回最大索引。在代码中:

p = np.array([[0.2, 0.4, 0.4],[0.1, 0.7, 0.2],[0.44, 0.5, 0.06]])
u = np.random.rand(p.shape[0])
idxs = (p.cumsum(1) < u).sum(1)

那么idxs将根据p的行进行采样。例如:

np.histogram((p[0].cumsum() < np.random.rand(10000,1)).sum(1), bins=3)
# array([1977, 4018, 4005]), ... 

【讨论】:

  • 这似乎与 mathfux 链接中发布的策略相同,并且似乎是一个很好的解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-05-15
  • 2011-05-21
  • 1970-01-01
  • 2018-10-26
  • 2012-11-21
  • 2014-10-24
相关资源
最近更新 更多