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

rand([true,false], 10)

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

4
Georgery 16 Апр 2020 в 14:26

1 ответ

Лучший ответ

Используйте функцию 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
6
Bogumił Kamiński 16 Апр 2020 в 11:44