我有一个字典中的键列表,希望为每个项目分配0到1之间的数字,使得所分配的数字总和为1。如何实现这一点?我尝试使用rand()函数,但没有成功。有什么建议吗?
我有一个字典中的键列表,希望为每个项目分配0到1之间的数字,使得所分配的数字总和为1。如何实现这一点?我尝试使用rand()函数,但没有成功。有什么建议吗?
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
您可以通过以下方式随机生成一个“概率向量”,即长度为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))