1

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

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

相反,我想要一个随机向量,其中包含[-1,1] 和总和为 1的值,有人告诉我可以通过将 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
4

3 回答 3

3

问题是区间[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。

于 2020-09-15T23:11:36.533 回答
1

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

于 2020-11-03T04:19:48.197 回答
1

正如 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
于 2020-09-16T07:09:22.710 回答