假设我有一个正权重向量,a=(a1, a2, a3, a4)
使得a2=a3
和a1+a2+a3+a4=1
。有没有办法使用 R 对这种权重进行采样?我试图考虑使用 Dirichlet 分布,但它没有提供强制两个变量相等的机制。
2 回答
为了在集合中均匀采样{(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
因此,我们可以a2
通过选择一个均匀分布的值u~U(0, 1)
并设置a2
为等于 的值k
来对 的值进行采样4k - 4k^2 = u
。通过二次公式求解,得到:
a2 = 0.5 * (1 - sqrt(1-u))
在 R 中,我们可以对 1000 个值进行采样a2
:
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
值的分布相同)。因为我们a1
在 range 中统一选择[0, 1-2*a2]
,所以较低的值比较高的值更常见:
这是a2
值的分布(根据定义,这与值的分布相同a3
)。分布的形状与 的形状相似a1
,但最大值为 0.5:
我试着考虑使用狄利克雷分布,
好吧,对我来说,它看起来像狄利克雷分布。
但它没有提供强制两个变量相等的机制。
但你不必。您实际上有三个来自 Dirichlet 分布的变量 - 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 中)