您好
我想创建一个包含不同间隔数字的数组。
例如,使用以下代码:
using Distributions
A = rand(Uniform(1,10),1,20)
“A”包含1到10之间的20个数字。
我想创建“B”,其中“B”包含介于1和4之间,或介于6和10之间但不介于4和6之间的20个数字。
有可能吗?
谢谢
答案 0 :(得分:3)
我认为对于一般用例,您希望确保您采样的新概率仍然是一个统一的概率,尽管分布在非连接范围内。
我将一个从多个断开的均匀分布产生新均匀分布的函数混合在一起:
using Distributions
function general_uniform(distributions...)
all_dists = [distributions...]
sort!(all_dists, by = D -> minimum(D))
# make sure ranges are non overlapping
@assert all(map(maximum, all_dists)[1:end-1] .<= map(minimum, all_dists)[2:end])
dist_legths = map(D -> maximum(D) - minimum(D), all_dists)
ratios = dist_legths ./ sum(dist_legths)
return MixtureModel(all_dists, Categorical(ratios))
end
然后你可以像这样从中抽样:
B = rand(general_uniform(Uniform(1,4), Uniform(6,10)),1,20)
即使您的范围长度不同,也可以统一分发。例如:
general_uniform(Uniform(0,1), Uniform(1,10))
从0-1范围内采样概率为0.1,范围1-10采样概率为0.9。
例如,以下数字大约为5:
mean(rand(general_uniform(Uniform(0,9), Uniform(9,10)),1000))
答案 1 :(得分:2)
不确定
numbers = []
for i in 1 : 20
if rand() < 0.5
push!(numbers, rand(Uniform(1,4)))
else
push!(numbers, rand(Uniform(6,10)))
end
end
您也可以混合使用:
D = MixtureModel([Uniform(1,4), Uniform(6,10)], Categorical([0.5,0.5]))
rand(D, 1, 20)
在这里,你必须指定一个概率分布,从中选择均匀分布,因此Categorical
。上面的代码以相同的概率从每个均匀范围中采样。您可以根据需要更改分类来调整权重。
答案 2 :(得分:1)
使用两个均匀分布的混合模型
rand(MixtureModel(Uniform[Uniform(1,4),Uniform(6,10)]),1,20)
编辑::只有间隔的大小相等时,此采样才是正确的!
HTH!