Как случайным образом выровнять неравные значения? - PullRequest
0 голосов
/ 29 ноября 2018

Скажем, у меня есть несколько неравных значений a, b, c, d, e.Можно ли превратить эти неравные значения в равные значения, просто используя генерацию случайных чисел?

Пример: a = 100, b = 140, c = 200, d = 2, e = 1000.Я хочу, чтобы алгоритм выбирал случайным образом эти наборы так, чтобы наибольшее значение предназначалось чаще всего, а наименьшее значение оставалось одним для большинства частей.

Области, где я столкнулся с проблемами: если я просто использую генерацию неуникальных случайных чисел, то значение e в конечном итоге перейдет под другие значения.Если я использую генерацию уникальных чисел, то соотношение между значениями не меняется, даже если их абсолютные значения меняются.Я пытался использовать наборы, где определенный диапазон чисел должен быть достигнут определенное количество раз, прежде чем значение изменится.Я еще не пробовал использовать сочетание уникальных / неуникальных случайных чисел.

Я хочу, чтобы соотношение между значениями постепенно приближалось к 1 во время работы алгоритма.

Еще один способ осмыслить проблему: скажем, все эти значения a, b, c, d, e равны.Если мы случайным образом выберем один, каждый из них будет выбран так же, как и любой другой.После того, как мы выбираем один, мы добавляем 1 к этому значению.Затем мы запускаем этот процесс снова.На этот раз значение, которое было выбрано в прошлый раз, на 1 больше, чем любое другое значение, поэтому оно будет выбрано с большей вероятностью, чем любое другое значение.Это создает эффект снежного кома, когда значение, выбранное первым, вероятно, будет продолжать отбираться и достигать безудержного роста.Я ищу противоположность этому алгоритму, где мы начинаем после того, как эти первоначально равные значения разошлись, и мы возвращаем их обратно в изначально равное состояние.

Я думаю, что этот процесс невозможен из-за энтропии иприсущ односторонний характер существования.

1 Ответ

0 голосов
/ 29 ноября 2018

Ну, есть метод, который называется Inverse Weights, где вы выбираете предметы обратно пропорционально их предыдущему виду.Каждый раз, когда мы производим выборку a, b, c, d или e, мы обновляем их числа появления и пересчитываем вероятности.Простой код на Python, я выбираю числа [0 ... 4] как a, b, c, d, e и начинаю с того, что вы перечислили как появления.После 100 000 выборок они выглядят равнораспределенными

import numpy as np

n = np.array([100, 140, 200, 2, 1000])

for k in range(1, 100000):

    p  = (1.0 / n) # make probabilities inverse to weights
    p /= np.sum(p) # normalization

    a = np.random.choice(5, p = p) # sampling numbers in the range [0...5)

    n[a] += 1 # update weights

print(n)

Выход

[20260 20194 20290 20305 20392]
...