微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

numpy范围为[-1,1]的变换Dirichlet数组

如何解决numpy范围为[-1,1]的变换Dirichlet数组

从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。那对我有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。