问题描述
从Dirichlet分布中采样的随机向量包含落在域[0,1]中的值,它们的和为1 。在numpy中,可以像这样将向量大小设置为5:
x = numpy.random.dirichlet(np.ones(5))
相反,我想要一个随机向量,该向量包含 [-1,1]且总和为1 ,可以通过转换生成的Dirichlet {{ 1}}向量为x
以下是此转换的尝试。但是,该脚本无法正常运行,因为y = 2x -1
不能根据需要求和为1。怎么解决?或者y
不按照他们的意思做?
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,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。
,正如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
,
尝试y=1/(dimension/3)-2*x
。那对我有用。