具有总和和等式约束的正权重采样
Sampling of positive weights with sum unity and an equality constraint
假设我有一个正权重向量 a=(a1, a2, a3, a4)
使得 a2=a3
和 a1+a2+a3+a4=1
。有什么方法可以使用 R 对这种权重进行采样吗?我试着考虑使用 Dirichlet 分布,但它没有提供强制两个变量相等的机制。
为了在集合 {(a1, a2, a3, a4 | a2=a3, a1+a2+a3+a4=1, a1>0, a2>0, a3>0, a4>0}
中均匀采样,我将首先对 a2
的值进行采样(等于 a3
)。为此,我们需要知道这个值的分布。如果a2 = a3 = r
,那么我们有a1+a4 = 1-2r
;对于正的 a1 和 a4,有一条长度为 (1-2k)*sqrt(2)
的线段,其中包含 a1
和 a4
的所有可行值。积分,a2
等于k
或更小的概率是4(k - k^2)
。更详细:
Prob (a2 <= k) = Integral(0 to k) (1-2r)*sqrt(2) dr / Integral(0 to 0.5) (1-2r)*sqrt(2) dr
= ((k-k^2)*sqrt(2)) / (sqrt(2)/4)
= 4k - 4k^2
因此,我们可以通过 select 均匀分布的值 u~U(0, 1)
并将 a2
设置为等于 k
的值来对 a2
的值进行采样4k - 4k^2 = u
。通过二次公式求解,得到:
a2 = 0.5 * (1 - sqrt(1-u))
在 R 中,我们可以为 a2
采样 1000 个值:
set.seed(144)
a2 <- 0.5 * (1 - sqrt(1 - runif(1000)))
a3 <- a2
给定一个固定值a2 = a3 = k
,a1
的值均匀分布在[0, 1-2k]
中:
a1 <- runif(1000) * (1 - 2*a2)
已指定 a1
、a2
和 a3
,a4
只有一个可能的值:
a4 <- 1 - a1 - a2 - a3
我们可以看一下我们的一些采样值:
head(cbind(a1, a2, a2, a4))
# a1 a2 a2 a4
# [1,] 0.83455239 0.01251016 0.01251016 0.14042729
# [2,] 0.02744599 0.22932773 0.22932773 0.51389856
# [3,] 0.45835472 0.23860119 0.23860119 0.06444291
# [4,] 0.36843649 0.14679703 0.14679703 0.33796946
# [5,] 0.35109881 0.08702039 0.08702039 0.47486041
# [6,] 0.02916818 0.19942616 0.19942616 0.57197949
这是 a1
值的分布(请注意,根据对称性,这与 a4
值的分布相同)。因为我们 select a1
统一在 [0, 1-2*a2]
范围内,较低的值比较高的值更常见:
这是 a2
值的分布(根据定义,这与 a3
值的分布相同)。分布的形状类似于a1
,但最大值为0.5:
I tried to think about using the Dirichlet distribution,
嗯,对我来说它看起来像 Dirichlet 分布。
but it gives no mechanism to force two of the variates to be equal.
但您不必这样做。实际上,狄利克雷分布具有三个变量 - A、B、C,所有 >= 0,均匀分布 U(0,1),因此 A+B+C=1
采样后 (A, B, C) 你只需赋值
a1 = A;
a2 = B/2.0;
a3 = B/2.0;
a4 = C;
请看一下如何采样(好吧,在 Python 中)
Generating N uniform random numbers that sum to M
假设我有一个正权重向量 a=(a1, a2, a3, a4)
使得 a2=a3
和 a1+a2+a3+a4=1
。有什么方法可以使用 R 对这种权重进行采样吗?我试着考虑使用 Dirichlet 分布,但它没有提供强制两个变量相等的机制。
为了在集合 {(a1, a2, a3, a4 | a2=a3, a1+a2+a3+a4=1, a1>0, a2>0, a3>0, a4>0}
中均匀采样,我将首先对 a2
的值进行采样(等于 a3
)。为此,我们需要知道这个值的分布。如果a2 = a3 = r
,那么我们有a1+a4 = 1-2r
;对于正的 a1 和 a4,有一条长度为 (1-2k)*sqrt(2)
的线段,其中包含 a1
和 a4
的所有可行值。积分,a2
等于k
或更小的概率是4(k - k^2)
。更详细:
Prob (a2 <= k) = Integral(0 to k) (1-2r)*sqrt(2) dr / Integral(0 to 0.5) (1-2r)*sqrt(2) dr
= ((k-k^2)*sqrt(2)) / (sqrt(2)/4)
= 4k - 4k^2
因此,我们可以通过 select 均匀分布的值 u~U(0, 1)
并将 a2
设置为等于 k
的值来对 a2
的值进行采样4k - 4k^2 = u
。通过二次公式求解,得到:
a2 = 0.5 * (1 - sqrt(1-u))
在 R 中,我们可以为 a2
采样 1000 个值:
set.seed(144)
a2 <- 0.5 * (1 - sqrt(1 - runif(1000)))
a3 <- a2
给定一个固定值a2 = a3 = k
,a1
的值均匀分布在[0, 1-2k]
中:
a1 <- runif(1000) * (1 - 2*a2)
已指定 a1
、a2
和 a3
,a4
只有一个可能的值:
a4 <- 1 - a1 - a2 - a3
我们可以看一下我们的一些采样值:
head(cbind(a1, a2, a2, a4))
# a1 a2 a2 a4
# [1,] 0.83455239 0.01251016 0.01251016 0.14042729
# [2,] 0.02744599 0.22932773 0.22932773 0.51389856
# [3,] 0.45835472 0.23860119 0.23860119 0.06444291
# [4,] 0.36843649 0.14679703 0.14679703 0.33796946
# [5,] 0.35109881 0.08702039 0.08702039 0.47486041
# [6,] 0.02916818 0.19942616 0.19942616 0.57197949
这是 a1
值的分布(请注意,根据对称性,这与 a4
值的分布相同)。因为我们 select a1
统一在 [0, 1-2*a2]
范围内,较低的值比较高的值更常见:
这是 a2
值的分布(根据定义,这与 a3
值的分布相同)。分布的形状类似于a1
,但最大值为0.5:
I tried to think about using the Dirichlet distribution,
嗯,对我来说它看起来像 Dirichlet 分布。
but it gives no mechanism to force two of the variates to be equal.
但您不必这样做。实际上,狄利克雷分布具有三个变量 - A、B、C,所有 >= 0,均匀分布 U(0,1),因此 A+B+C=1
采样后 (A, B, C) 你只需赋值
a1 = A;
a2 = B/2.0;
a3 = B/2.0;
a4 = C;
请看一下如何采样(好吧,在 Python 中)
Generating N uniform random numbers that sum to M