如何在Julia中生成随机概率分布

3

我有一个字典中的键列表,希望为每个项目分配0到1之间的数字,使得所分配的数字总和为1。如何实现这一点?我尝试使用rand()函数,但没有成功。有什么建议吗?


1
这个回答解决了您的问题吗?获取N个随机数,使它们的和为M - Peter O.
2个回答

4
更加数学化的答案是使用狄利克雷分布。具体而言,一个集中参数为1.0的对称狄利克雷分布在N-单纯形上是均匀分布的:
julia> using Distributions

julia> d = rand(Dirichlet(4, 1.0))
4-element Vector{Float64}:
 0.1629111431248381
 0.025227624238719375
 0.030334086399317672
 0.7815271462371249

julia> sum(d)
1.0

2

您可以通过以下方式随机生成一个“概率向量”,即长度为d的向量,其所有条目均为非负数且总和为1:

using Random

rand_probvec(d) = rand_probvec(Random.GLOBAL_RNG, d)

function rand_probvec(rng, d)
    unif = rand(rng, d - 1)
    T = eltype(unif)
    w = zeros(T, d + 1)
    w[2:d] .= sort(unif)
    w[d+1] = one(T)
    return diff(w)
end

以下是http://www.cs.cmu.edu/~nasmith/papers/smith+tromble.tr04.pdf的内容。

如果您不关心您的分布是否是均匀随机的,您可以只需随机生成d个数字并将它们相加后除以总和即可,例如:

function rand_probvec2(d)
    v = rand(d)
    return v / sum(v)
end

不管怎样,一旦你能够生成随机概率向量,如果你有一个元素列表需要分配概率,你可以这样做:
my_list = ["a", "b", "c"]
prob_vec = rand_probvec(length(my_list))
my_dist = Dict(k => prob_vec[i] for (i, k) in enumerate(my_list))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接