Образец из вектора / массива с вероятностями - PullRequest
4 голосов
/ 16 апреля 2020

У меня есть Bool вектор, просто [true, false]. Я могу сделать 10 выборок из этого вектора с

rand([true,false], 10)

, но как мне добиться, чтобы true рисовалось с вероятностью 80%, а false - с вероятностью 20%?

1 Ответ

6 голосов
/ 16 апреля 2020

Используйте функцию sample из StatsBase.jl с аргументом Weights:

julia> using StatsBase

julia> sample([true, false], Weights([0.8, 0.2]), 10)
10-element Array{Bool,1}:
 1
 0
 1
 1
 1
 1
 1
 1
 1
 1

И чтобы убедиться, что вы получите то, что хотели, вы можете написать:

julia> countmap(sample([true, false], Weights([0.8, 0.2]), 10^8))
Dict{Bool,Int64} with 2 entries:
  false => 20003766
  true  => 79996234

(конечно, ваши точные числа будут отличаться)

Также, если вам конкретно нужна двоичная выборка, вы можете использовать Bernoulli распределение из Distributions.jl:

julia> using Distributions

julia> rand(Bernoulli(0.8), 10)
10-element Array{Bool,1}:
 0
 1
 1
 0
 1
 1
 1
 1
 1
 1

julia> countmap(rand(Bernoulli(0.8), 10^8))
Dict{Bool,Int64} with 2 entries:
  false => 20005900
  true  => 79994100

(вы можете ожидать, что этот метод Быстрее)

Наконец - если вы не хотите использовать какие-либо пакеты и вам нужен двоичный результат, вы можете просто написать rand(10) .< 0.8, и снова - вы получите то, что хотели:

julia> countmap(rand(10^8) .< 0.8)
Dict{Bool,Int64} with 2 entries:
  false => 20003950
  true  => 79996050
...