如何模拟三角形区域的均匀分布?

机器算法验证 随机生成 均匀分布
2022-04-11 05:34:50

我有三个随机实数:x1、x2 和 x3

每个都有约束 x > 0.1

它们一起遵循约束 x1 + x2 + x3 = 1

我想模拟 (x1,x2,x3) 所有可能性的均匀分布


我目前的想法如下:

使用后一个约束,df 变为 2 - 让我们考虑 x1 和 x2

我们可以使用一个不等式系统来表示上述约束:

  1. 0.1 < x1 < 0.8

  2. 0.1 < x2 < 0.8

  3. x1 + x2 < 0.9

它在笛卡尔平面上形成一个直角等腰三角形。

我打算模拟[x1~U(0.1,0.8),x2~U(0.1,0.8)]。对于不满足不等式 #3 的所有结果点,它们沿 x1 + x2 < 0.9 反映(或者,被丢弃)。

这应该导致三角形区域的均匀分布。


我的问题是这是否是最有效的算法。我可以以某种方式修改模拟以直接模拟三角形吗?即无需进行反射或丢弃任何模拟点。

2个回答

上的均匀分布,所有,称为狄利克雷分布通过设置上实现均匀分布,因为它会以恒定的比例因子缩小所有内容,因此保留相对区域。y1+y2+y3=1yi0(1,1,1)xi=(13×0.1)yi+0.1x1+x2+x3=0.7

Dirichlet 分布的值可以通过生成独立的 Gamma 变量并将它们除以它们的总和来获得。意味着这些 Gamma 变量中的每一个都必须具有 Gamma分布(这是一个指数分布)。(1,1,1)(1)

这是示例R代码:

n <- 1e3
alpha <- 1
x <- matrix(rgamma(n*3, alpha), ncol=3)
x <- x / rowSums(x) * 0.7 + 0.1

顺便说一句,生成原始坐标(在第三行)的另一种方法是均匀分布

x <- matrix(-log(runif(3*n)), ncol=3)

因为的分布,对于均匀,是指数的。因此,该方法不需要执行特殊的统计功能。log(U)U

但是如何确认结果是正确的呢?一种方法是将单纯形旋转到平面中并绘制点。R代码计算这样一个旋转矩阵,通过验证其叉积是恒等来确认它是一个旋转矩阵,并绘制点。

beta <- apply(contr.helmert(3), 2, function(y) y / sqrt(crossprod(y)))
crossprod(cbind(beta, 1/sqrt(3))) # Outputs the 3 x 3 identity matrix
z <- x %*% beta
plot(z)

他们看起来很统一。

数字

对于Mathematica用户,执行 OP 要求的一种简单方法是在笛卡尔平面上定义直角等腰三角形:

  R = Triangle[{{.1, .1}, {.1, .8}, {.8, .1}}];

...然后从中绘制(统一)随机数:

pts = RandomPoint[R, 10^4];

全部完成。

要在其中可视化三角形R和样本数据pts

Graphics[{R, Red, PointSize[Tiny], Point[pts]}, Frame->True, PlotRange -> {{0,1}, {0,1}}] 

在此处输入图像描述

其中 x1、x2 和 x3 由下式给出:

{x1, x2} = Transpose[pts];     x3 = 1-x1-x2;