Автор оригинала: Neeraj Sujan.
Вероятность и статистика играют очень важную роль в области Наука и машина науки и машины Отказ В этом посте в блоге вы узнаете концепцию Пропорциональная выборка И как мы можем реализовать его с нуля без использования любой библиотеки
Пропорциональная выборка
Давайте возьмем пример бросания умереть, чтобы лучше понять концепцию пропорциональной выборки. Беспристращенная умирание – это умереть, в котором вероятность получения числа от 1 до 6 равна. Давайте теперь представим, что умирают смещены, то значение веса дается каждую сторону умира.
1 | 2 | 3 | 4 | 5 | 6 |
20 | 12 | 60 | 58 | 33 | 10 |
Пропорциональная выборка – это методика, в которой вероятность выбора числа пропорциональна весу этого числа. Итак, например, если мы проведем эксперимент подбрасывания умирания 100 раз, то вероятность получения 6 будет самым низким, так как значение веса со стороны 6 составляет 10, что является самым низким среди всех других ценностей веса. С другой стороны, вероятность получения 4 была бы самой высокой, поскольку значение веса для 3 составляет 60, что является самым высоким среди всех других ценностей.
Есть 3 основных шагов к пропорциональному образцу номера из списка.
- Вычисляя Кумулятивная нормализованная сумма ценности
- Выбор случайного значения из равномерного распределения
- Отборка значения
Кумулятивная нормализованная сумма
Чтобы вычислить совокупную нормированную сумму, нам сначала нужно рассчитать общую сумму значений веса, а затем нормализовать значения веса, разделив каждое значение веса на общую сумму. После нормализации значений веса у нас будут все значения от 0 до 1, и сумма всех значений всегда будет равна 1.
Давайте объявляем переменную, называемую кубиками и весами, которые представляют 6 сторон умира соответствующие значения веса
dice = [1, 2, 3, 4, 5, 6] weights = [20, 12, 60, 58, 33, 10]
Теперь мы будем вычислить сумму всех весов и хранить ее в переменной под названием total_sum
Отказ Мы можем использовать Встроенный Сумма функции для этого.
total_sum = sum(weights) normalized_weights = [weight/total_sum for weight in weights] print(normalized_weights)
Нормализованные веса имеют значения от 0 до 1, а сумма всех значений равна 1
[0.10362694300518134, 0.06217616580310881, 0.31088082901554404, 0.3005181347150259, 0.17098445595854922, 0.05181347150259067]
Совокупная сумма используется для мониторинга обнаружения изменения в последовательном наборе данных. Давайте обозначаем совокупную сумму переменной под названием Вес_cum_sum
и вычисляя это следующим образом
weight_cum_sum[0] = normalized_weights[0] weight_cum_sum[1] = weight_cum_sum[0] + normalized_weights[1] weight_cum_sum[2] = weight_cum_sum[1] + normalized_weights[2] weight_cum_sum[3] = weight_cum_sum[2] + normalized_weights[3] weight_cum_sum[4] = weight_cum_sum[3] + normalized_weights[4] weight_cum_sum[5] = weight_cum_sum[4] + normalized_weights[5]
Мы можем сделать это эффективно в Python, запустив для цикла и добавления совокупных значений суммирования в списке
cum_sum = [normalized_weights[0]] for i in range(1, len(normalized_weights)): cum_sum.append(cum_sum[i-1] + normalized_weights[i])
Если мы Печать cum_sum.
мы получим следующие значения
[0.10362694300518134, 0.16580310880829013, 0.47668393782383417, 0.7772020725388601, 0.9481865284974094, 1.0]
Выбирая случайное значение
Теперь, когда мы рассчитали совокупную сумму значений веса, теперь мы будем случайно выбрать число от 0 до 1 из равномерного распределения. Мы можем сделать это с помощью единой функции из случайного модуля в Python. Мы будем обозначить это число по r.
from random import uniform r = uniform(0,1)
Выборка
Теперь мы будем петля через cum_sum
массив и если значение r меньше или равно cum_sum
значение в определенном индексе, то мы вернем значение умирания в этот индекс
for index, value in enumerate(cum_sum): if r <= value: return dice[index]
Вы можете увидеть весь код ниже
from random import uniform def proportional_sampling(dice, weights): total_sum = sum(weights) normalized_weights = [weight/total_sum for weight in weights] cum_sum = [normalized_weights[0]] r = uniform(0,1) for i in range(1, len(normalized_weights)): cum_sum.append(cum_sum[i-1] + normalized_weights[i]) for index, value in enumerate(cum_sum): if r <= value: return dice[index] dice = [1,2,3,4,5,6] weights = [20, 12, 60, 58, 33, 10] sampled_value = proportional_sampling(dice, weights)
Эксперименты
Теперь у нас будет проведен эксперимент, где позвонит пропорционально_sampling
100 раз и анализировать результат отбора проб
dice_result = {} for i in range(0, 100): sampled_value = proportional_sampling(dice, weights) if sampled_value not in dice_result: dice_result[sampled_value] = 1 else: dice_result[sampled_value] += 1
Как вы можете видеть, из вышеупомянутого рисунка, вероятность получения 3 – самое высокое, так как 3 получали вес 60, что было наибольшее количество в массиве весов. Если мы запустим этот эксперимент для 1000 итераций вместо 100, вы можете ожидать, чтобы получить еще более точные результаты.
Оригинал: “https://blog.finxter.com/proportional-sampling-using-weighted-values/”