【问题标题】:How to create multivariate uniform distribution?如何创建多元均匀分布?
【发布时间】:2017-10-12 11:21:47
【问题描述】:

目标

我想从在 java 中指定 correlation coefficient 的双变量均匀分布中采样。

问题

  • 我可以使用什么方法来实现这种多元均匀分布?

  • 是否有现有的包可以实现这样的事情,这样我就不必重新发明轮子了?

到目前为止我所得到的

R 中的包mvtnorm 允许从具有指定相关系数的多元正态分布中采样。我认为理解他们的方法可以帮助我解决问题,方法是对均匀分布做类似的事情,或者重复他们的工作并使用copulas 将多元正态转换为多元均匀(就像我在 R there 中所做的那样)。

源代码是用 Fortran 编写的,我不会说 Fortran!代码基于this paper by Genz and Bretz,但对我来说数学太重了。

【问题讨论】:

  • 您可以使用apache.commons.math 来避免重新发明轮子,尽管您没有直接的多元均匀分布;你有例如multivariate normal distributionuniform distribution。无论如何,您可以重用代码来构建它。 ...
  • ... [继续] 您应该扩展 AbstractMultivariateRealDistribution 对象,从 UniformRealDistribution 复制大部分内容。困难的部分是您提到将两者结合起来,但也许您可以翻译您提到的使用 copulas 的 R 代码?

标签: java random statistics distribution


【解决方案1】:

我有个主意。通常,您通过生成 32 个随机位并除以 232 来生成 U(0,1),返回一个浮点数。对于两个 U(0,1),您生成两个 32 位值,除以两个浮点数。到目前为止,一切都很好。这样的双变量生成器将是不相关的,检查起来非常简单等

假设您按照以下方式构建它的双变量生成器。在里面,你得到两个随机的 32 位整数,然后产生两个具有共享部分的 U(0,1)。比如说,你从第一个整数中取 24 位,为第二个整数取 24 位,但是对于它们两者来说,上(或下、中、或……)8 位将是相同的(从第一个整数中取出并复制到第二个)。

显然,这两个 U(0,1) 是相关的。我们可以把它们写成

U(0,1)0 = a0 + b

U(0,1)1 = a1 + b

为简单起见,我省略了一些系数等。每个都是 U(0,1),均值为 1/2,方差为 1/12。现在您必须将 Pearson 相关性计算为

r = ( E[U(0,1)0 U(0,1)1] - 1/4 ) / sqrt(1/12)2

在一些代数之后使用上面的扩展应该很容易计算r并与您想要的比较。您可以改变相关部分b 的大小以及它的位置(高位、低位、中间某处)以适合所需的r

实际上,拥有相同的r 但不同的采样代码和不同的双变量分布应该有无限可能。您可能希望在未来添加更多约束

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 2013-06-02
    • 2021-08-14
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多