【问题标题】:Transformed Dirichlet array with range [-1,1] in numpynumpy中范围为[-1,1]的转换Dirichlet数组
【发布时间】:2020-09-15 22:32:20
【问题描述】:

从狄利克雷分布中采样的随机向量包含落在 域 [0,1] 中的值,它们的总和为 1。在 numpy 中,它可以这样编程,向量大小为 5:

x = numpy.random.dirichlet(np.ones(5))

相反,我想要一个包含 [-1,1] 且总和为 1 的值的随机向量,I was told 可以通过转换 Dirichlet 生成的 x 向量来实现如y = 2x -1

下面是这种转换的尝试。但是,该脚本无法正常工作,因为 y 没有根据需要求和为 1。怎么解决,还是y = 2x -1不按他们说的做?

x = numpy.random.dirichlet(np.ones(5))
y = 2*x -1
print(x, np.sum(x))
print(y, np.sum(y))

哪个输出:

[0.0209344  0.44791586 0.21002354 0.04107336 0.28005284] 1.0
[-0.9581312  -0.10416828 -0.57995291 -0.91785327 -0.43989433] -3.0000000000000004

【问题讨论】:

  • 打印输出实际显示什么?
  • 在输出中编辑。总和是一个负整数,缩放到目标元素数(大小 5)

标签: python numpy transformation dirichlet


【解决方案1】:

问题是区间[0, 1] 可以有一个也是唯一一个到区间[-1, 1] 的线性映射,实际上是一个映射x -> 2x - 1。但它不能保证你的总和会稳定。从这些观察中可以看出一个原因:

np.sum(x)
0.9999999999999999
np.sum(2*x)
1.9999999999999998
np.sum(2*x-1)
-3.0

如您所见,最后一个总和并没有像预期的那样减少 1。它实际上减少了 5,因为 5 项中的每一项都减少了 1。

【讨论】:

  • 所以脚本是正确的,但建议的数学转换是错误的?
  • 是的,我同意。一篇文章说您无法获得所需的金额,这在 Sectus 在 StackExchange 中的回答的第二部分中提到了
  • 还有其他选择吗?除了这里显示的stackoverflow.com/questions/63891845/…
  • 我们只讨论了线性地图。不知道其他类型,例如指数或 smth。
【解决方案2】:

试试y=1/(dimension/3)-2*x。这对我有用。

【讨论】:

  • 如果dimension=2,但是,这个答案可以给出一个大于 1 的元素,它跨越了所需的界限。除此之外,到目前为止,所有dimensions>2 都比任何其他答案都好用
【解决方案3】:

正如 stats.stackexchange 上的一个答案所解释的:只有一种方法可以将 Dirichlet 分布的变量映射到 [-1,1] 同时保持总和等于 1 . 这是当维度为 3 并且使用 y=1-2x 时

import numpy
numpy.random.seed(seed = 1)
x = numpy.random.dirichlet(alpha = numpy.ones(3), size = 1)
y = 1-2*x
print(x, numpy.sum(x))
print(y, numpy.sum(y))

哪个打印:

[[2.97492728e-01 7.02444212e-01 6.30601451e-05]] 1.0000000000000002
[[0.40501454 -0.40488842  0.99987388]] 0.9999999999999998

【讨论】:

  • 不是尺寸,是尺寸。
  • @mathfux alpha 向量的大小是输出变量的维度。或者至少,这是根据documentation“从狄利克雷分布中绘制尺寸为 k 的样本”中的术语
猜你喜欢
  • 2020-01-10
  • 1970-01-01
  • 2017-04-16
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多