Выборка из совокупности
API выборки
Этот пакет содержит функции для выполнения выборки из заданной совокупности (с заменой или без нее).
#
StatsBase.sample — Function
sample([rng], a, [wv::AbstractWeights])
Выбирает один случайный элемент из a. Вероятности выборки пропорциональны весам в векторе wv, если он передан.
При необходимости первым аргументом можно указать генератор случайных чисел rng (по умолчанию Random.GLOBAL_RNG).
sample([rng], a, [wv::AbstractWeights], n::Integer; replace=true, ordered=false)
Выполняет случайную выборку (возможно, взвешенную) размера n из массива a с помощью полиалгоритма. Вероятности выборки пропорциональны весам, в векторе wv, если он передан. Аргумент replace определяет, выполняется ли выборка с заменой. Аргумент ordered определяет, следует ли получить упорядоченную выборку (также называемую последовательной; это такая выборка, в которой элементы следуют в том же порядке, что и в a).
При необходимости первым аргументом можно указать генератор случайных чисел rng (по умолчанию Random.GLOBAL_RNG).
sample([rng], a, [wv::AbstractWeights], dims::Dims; replace=true, ordered=false)
Выполняет случайную выборку (возможно, взвешенную) из массива a с указанием измерений dims выходного массива. Вероятности выборки пропорциональны весам в векторе wv, если он передан. Аргумент replace определяет, выполняется ли выборка с заменой. Аргумент ordered определяет, следует ли получить упорядоченную выборку (также называемую последовательной; это такая выборка, в которой элементы следуют в том же порядке, что и в a).
При необходимости первым аргументом можно указать генератор случайных чисел rng (по умолчанию Random.GLOBAL_RNG).
sample([rng], wv::AbstractWeights)
Выбирает одно случайное целое число из диапазона 1:length(wv) с вероятностями, пропорциональными весам в векторе wv.
При необходимости первым аргументом можно указать генератор случайных чисел rng (по умолчанию Random.GLOBAL_RNG).
#
StatsBase.sample! — Function
sample!([rng], a, [wv::AbstractWeights], x; replace=true, ordered=false)
Выполняет случайную выборку length(x) элементов из массива a и сохраняет результат в x. Для выборки используется полиалгоритм. Вероятности выборки пропорциональны весам в векторе wv, если он передан. Аргумент replace определяет, выполняется ли выборка с заменой. Аргумент ordered определяет, следует ли получить упорядоченную выборку (также называемую последовательной; это такая выборка, в которой элементы следуют в том же порядке, что и в a).
При необходимости первым аргументом можно указать генератор случайных чисел rng (по умолчанию Random.GLOBAL_RNG).
Выходной массив a не должен быть тем же объектом, что и x или wv, и не должен размещаться в той же области памяти, иначе результат может быть неверным.
#
StatsBase.wsample — Function
wsample([rng], [a], w)
Выполняет взвешенную случайную выборку размера 1 из a с вероятностями, пропорциональными весам в w. Если аргумент a отсутствует, выбирает случайный вес из w.
При необходимости первым аргументом можно указать генератор случайных чисел rng (по умолчанию Random.GLOBAL_RNG).
wsample([rng], [a], w, n::Integer; replace=true, ordered=false)
Выполняет взвешенную случайную выборку размера n из a с вероятностями, пропорциональными весам в w, если задан аргумент a; в противном случае выполняет случайную выборку размера n из весов в w. Аргумент replace определяет, выполняется ли выборка с заменой. Аргумент ordered определяет, следует ли получить упорядоченную выборку (также называемую последовательной; это такая выборка, в которой элементы следуют в том же порядке, что и в a).
При необходимости первым аргументом можно указать генератор случайных чисел rng (по умолчанию Random.GLOBAL_RNG).
wsample([rng], [a], w, dims::Dims; replace=true, ordered=false)
Выполняет взвешенную случайную выборку из a с вероятностями, пропорциональными весам в w, если задан аргумент a; в противном случае выполняет случайную выборку размера n из весов в w. Измерения выходного массива указываются в dims.
При необходимости первым аргументом можно указать генератор случайных чисел rng (по умолчанию Random.GLOBAL_RNG).
#
StatsBase.wsample! — Function
wsample!([rng], a, w, x; replace=true, ordered=false)
Выполняет взвешенную выборку из массива a и сохраняет результат в x. Вероятности выборки пропорциональны весам в w. Аргумент replace определяет, выполняется ли выборка с заменой. Аргумент ordered определяет, следует ли получить упорядоченную выборку (также называемую последовательной; это такая выборка, в которой элементы следуют в том же порядке, что и в a).
При необходимости первым аргументом можно указать генератор случайных чисел rng (по умолчанию Random.GLOBAL_RNG).
Алгоритмы
На внутреннем уровне в этом пакете реализовано множество алгоритмов, а методы sample (и sample!) объединяют их в полиалгоритм, который выбирает конкретный алгоритм в зависимости от входных данных.
Обратите внимание, что выбор алгоритма в sample выполняется на основе результатов тщательного тестирования (см. perf/sampling.jl и perf/wsampling.jl). В большинстве случаев скорость выполнения будет достаточно высокой. Однако если вам известно, что в вашей ситуации особенно хорошо подходит определенный алгоритм, вы можете вызвать реализующую его внутреннюю функцию напрямую, чтобы немного повысить эффективность.
Ниже приводится список алгоритмов, реализованных в пакете. Эти функции не экспортируются (однако их все же можно импортировать из StatsBase с помощью директивы using).
Нотация
-
a: исходный массив, представляющий совокупность -
x: конечный массив -
wv: весовой вектор (типаAbstractWeights) для взвешенной выборки -
n: длинаa -
k: длинаx. При выборке без заменыkне должно быть большеn. -
rng: необязательный генератор случайных чисел (по умолчаниюRandom.default_rng()начиная с версии Julia 1.3 иRandom.GLOBAL_RNGв более ранних версиях)
Все приведенные ниже функции записывают результаты в массив x (предварительно выделенный в памяти) и возвращают x.
Алгоритмы выборки (не взвешенной)
#
StatsBase.direct_sample! — Method
direct_sample!([rng], a::AbstractArray, x::AbstractArray)
Прямая выборка: для каждого j в диапазоне 1:k случайно выбирает i из диапазона 1:n и задает x[j] = a[i] с n=length(a) и k=length(x).
Этот алгоритм использует k случайных чисел.
#
StatsBase.samplepair — Function
samplepair([rng], n)
Выбирает пару уникальных целых чисел от 1 до n без замены.
При необходимости первым аргументом можно указать генератор случайных чисел rng (по умолчанию Random.GLOBAL_RNG).
samplepair([rng], a)
Выбирает пару уникальных элементов из массива a без замены.
При необходимости первым аргументом можно указать генератор случайных чисел rng (по умолчанию Random.GLOBAL_RNG).
#
StatsBase.knuths_sample! — Function
knuths_sample!([rng], a, x)
Алгоритм Кнута S для случайной выборки без замены.
Справочные материалы: D. Knuth. The Art of Computer Programming. Vol 2, 3.4.2, стр. 142.
Этот алгоритм использует length(a) случайных чисел. Дополнительного места в памяти не требуется. Подходит для случаев, когда объем памяти ограничен.
#
StatsBase.fisher_yates_sample! — Function
fisher_yates_sample!([rng], a::AbstractArray, x::AbstractArray)
Тасование Фишера-Йетса (с преждевременным завершением).
Псевдокод:
n = length(a)
k = length(x)
# Создаем массив индексов
inds = collect(1:n)
for i = 1:k
# меняем элемент `i` местами с другим случайным элементом в inds[i:n]
# задаем элемент `i` в `x`
end
Этот алгоритм использует k=length(x) случайных чисел. На внутреннем уровне он использует целочисленный массив длиной n=length(a) для хранения тасуемых индексов. Он выполняется существенно быстрее алгоритма Кнута, особенно когда n больше k. Его сложность составляет для инициализации плюс для случайного тасования.
#
StatsBase.self_avoid_sample! — Function
self_avoid_sample!([rng], a::AbstractArray, x::AbstractArray)
Самоизбегающая выборка: выбранный индекс сохраняется в множестве. Если индекс уже был выбран ранее, выборка повторяется до тех пор, пока не будет выбран новый индекс.
Этот алгоритм использует примерно k=length(x) случайных чисел (или немного больше) и требует памяти для хранения множества выбранных индексов. Выполняется очень быстро при с n=length(a).
Однако если значение k велико и приближается к , частота отклонений резко возрастает, из-за чего производительность снижается.
#
StatsBase.seqsample_a! — Function
seqsample_a!([rng], a::AbstractArray, x::AbstractArray)
Выборка случайных подпоследовательностей с использованием алгоритма A, описанного в следующей работе (стр. 714): Jeffrey Scott Vitter. Faster Methods for Random Sampling. Communications of the ACM, 27 (7), July 1984.
Этот алгоритм использует случайных чисел при n=length(a). Выходные данные упорядочены.
#
StatsBase.seqsample_c! — Function
seqsample_c!([rng], a::AbstractArray, x::AbstractArray)
Выборка случайных подпоследовательностей с использованием алгоритма C, описанного в следующей работе (стр. 715): Jeffrey Scott Vitter. Faster Methods for Random Sampling. Communications of the ACM, 27 (7), July 1984.
Этот алгоритм использует случайных чисел при k=length(x). Выходные данные упорядочены.
#
StatsBase.seqsample_d! — Function
seqsample_d!([rng], a::AbstractArray, x::AbstractArray)
Выборка случайных подпоследовательностей с использованием алгоритма D, описанного в следующей работе (стр. 716—717): Jeffrey Scott Vitter. Faster Methods for Random Sampling. Communications of the ACM, 27 (7), July 1984.
Этот алгоритм использует случайных чисел при k=length(x). Выходные данные упорядочены.
Алгоритмы взвешенной выборки
#
StatsBase.direct_sample! — Method
direct_sample!([rng], a::AbstractArray, wv::AbstractWeights, x::AbstractArray)
Прямая выборка.
Каждая выборка производится путем сканирования весового вектора.
При k=length(x) и n=length(a) этот алгоритм:
-
использует
kслучайных чисел; -
имеет временную сложность , так как для каждого сканирования весового вектора требуется ;
-
не требует дополнительного места в памяти.
#
StatsBase.alias_sample! — Function
alias_sample!([rng], a::AbstractArray, wv::AbstractWeights, x::AbstractArray)
Метод псевдонимов.
Строит таблицу псевдонимов и выполняет выборку из нее.
Справочные материалы: Walker, A. J. An Efficient Method for Generating Discrete Random Variables with General Distributions. ACM Transactions on Mathematical Software 3 (3): 253, 1977.
При k=length(x) и n=length(a) этот алгоритм имеет временную сложность , связанную с построением таблицы псевдонимов, и сложность , связанную с каждой выборкой. Он использует случайных чисел.
#
StatsBase.naive_wsample_norep! — Function
naive_wsample_norep!([rng], a::AbstractArray, wv::AbstractWeights, x::AbstractArray)
Примитивная реализация взвешенной выборки без замены.
При инициализации создается копия весового вектора, а затем при выборе соответствующего элемента его вес задается равным нулю.
При k=length(x) и n=length(a) этот алгоритм использует случайных чисел и имеет общую временную сложность .
#
StatsBase.efraimidis_a_wsample_norep! — Function
efraimidis_a_wsample_norep!([rng], a::AbstractArray, wv::AbstractWeights, x::AbstractArray)
Взвешенная выборка без замены с использованием алгоритма Эфраимидиса-Спиракиса.
Справочные материалы: Efraimidis, P. S., Spirakis, P. G. Weighted random sampling with a reservoir. Information Processing Letters, 97 (5), 181—185, 2006. doi:10.1016/j.ipl.2005.11.003.
При k=length(x) и n=length(a) этот алгоритм имеет временную сложность при выборке элементов. Он использует случайных чисел.
#
StatsBase.efraimidis_ares_wsample_norep! — Function
efraimidis_ares_wsample_norep!([rng], a::AbstractArray, wv::AbstractWeights, x::AbstractArray)
Реализация взвешенной выборки без замены с использованием алгоритма A-Res Эфраимидиса-Спиракиса.
Справочные материалы: Efraimidis, P. S., Spirakis, P. G. Weighted random sampling with a reservoir. Information Processing Letters, 97 (5), 181—185, 2006. doi:10.1016/j.ipl.2005.11.003.
При k=length(x) и n=length(a) этот алгоритм имеет временную сложность при выборке элементов. Он использует случайных чисел.