Генерация данных на основе распределения - PullRequest
0 голосов
/ 21 октября 2019

У меня есть массив со значениями

data = [1,2,3,4,5]

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

Я пытался достичь этого с помощью:

def random_iti(start, end, starting_prob = 1.0, ending_prob = 0.1, num_samples = 20000):

    start = start
    end = end

    # Get days between `start` and `end`
    num = (end - start)

    linear_probabilities = expon.cdf(np.linspace(starting_prob, ending_prob, num), scale = 0.3)

    # normalize probabilities so they add up to 1
    linear_probabilities /= np.sum(linear_probabilities)

    rand_days = np.random.choice(num, size = num_samples, replace = True,
             p = linear_probabilities)

    rand =  [(start + int(rand_days))]

    # return list of date strings
    return rand


num_iti = random_iti(1, 5, starting_prob = 1.0, ending_prob = 0.1, num_samples=sample_count)

Однако выполнение этого кода дает мне:

Ошибка типа: в скаляры Python могут быть преобразованы только массивы размера 1

Может кто-нибудь посоветовать, что здесь не так и что нужно сделать, чтобы добиться того же.

1 Ответ

0 голосов
/ 21 октября 2019

Я почти уверен, что вам нужно будет выполнить цикл и сделать каждый случайный выбор отдельно;np.random.choice будет использовать одни и те же веса для каждой выборки независимо.

В любом случае ошибка происходит, потому что rand_days - это массив из 20000 значений;звонить int на это не имеет смысла. Приведение всего массива выполняется с использованием метода .astype, но они должны быть уже целыми числами , потому что они взяты из np.arange(num). (Кстати: это также ошибка - у нас есть start = 1 и end = 5, поэтому num = 4 - это означает, что возможные значения будут [0, 1, 2, 3] и , а не 4.)

Требуемое здесь преобразование rand = [(start + int(rand_days))] - просто: rand = start + rand_days. Но вместо этого мы можем сделать это чище: вместо того, чтобы передавать число в качестве первого аргумента для np.random.choice, вместо этого передайте фактический выборочный набор: np.arange(start, end+1) (поскольку, опять же, диапазоны не включают в себя вторую конечную точку). Или вместо передачи параметров start и end, передайте этот диапазон напрямую и используйте его непосредственно в функции - это дает вам больше возможностей настройки, так что вы можете выбирать из любого набора данных, который вам нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...