Неповторяющиеся случайные числа для нескольких переменных

Я пытаюсь создать функцию, которая применяет случайные значения к диапазону параметров, которые используются в другой функции, где случайная последовательность не повторяется.

Причина: используется для случайной настройки гиперпараметров и сокращения обработки за счет отсутствия повторения последовательности.

Пример кода:


num_evals = 2500

parameters = {
        'n_parameter_1': range(2,100),
        'n_parameter_2': range(1,20),
        'n_parameter_3': range(2,150),
              }  

for i in range(num_evals):
        n_parameter_1 = random.choice(parameters['n_parameter_1'])
        n_parameter_2 = random.choice(parameters['n_parameter_2'])
        n_parameter_3 = random.choice(parameters['n_parameter_3'])

Затем результаты заносятся в файл со случайными параметрами, используемыми для генерации.

Мне нужна помощь со вторым битом.

Поскольку эта функция работает с течением времени, вы начинаете получать последовательности, которые выглядят следующим образом:

n_parameter_1 = 54, n_parameter_2 = 15, n_parameter_3 = 120

n_parameter_1 = 10, n_parameter_2 = 12, n_parameter_3 = 89

n_parameter_1 = 54, n_parameter_2 = 15, n_parameter_3 = 120

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

Спасибо за помощь в продвижении.

Какой вопрос? Как избежать повторения?

user2390182 02.06.2023 11:54

В чем ваша настоящая проблема? У вас есть первая часть: «создайте функцию, которая применяет случайные значения к диапазону параметров», и мне непонятно, что вы подразумеваете под «где случайная последовательность не повторяется».

9769953 02.06.2023 11:56

Извините, поправил, чтобы было понятнее

Edd 02.06.2023 13:46

Вы пробовали random.shuffle вместо random.choice ?

manu190466 02.06.2023 13:53
random.shuffle и random.sample предоставляют набор неповторяющихся чисел из исходного образца. См. документацию для деталей и некоторых примеров. Таким образом, сначала создайте список для каждого случайного параметра, а затем выполните итерацию по этим спискам. Не пытайтесь выбирать случайный параметр каждый раз внутри цикла; подготовьте это перед циклом.
9769953 02.06.2023 13:56

Считали ли вы, что случайная выборка может быть не лучшим подходом? При соответствующем планировании экспериментов вы, возможно, могли бы подобрать модель поверхности отклика, которая могла бы рассказать вам о влиянии каждого параметра, как по отдельности, так и совместно через условия взаимодействия, чтобы облегчить ваши усилия по «настройке». Хороший дизайн, скорее всего, даст вам больше информации с меньшим количеством выборок. См. en.wikipedia.org/wiki/Data_farming и en.wikipedia.org/wiki/Response_surface_methodology.

pjs 02.06.2023 17:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сохранить последовательности в наборе, а затем проверить, есть ли уже последовательность в наборе.

num_evals = 2500
i = 0

parameters = {
        'n_parameter_1': range(2,100),
        'n_parameter_2': range(1,20),
        'n_parameter_3': range(2,150),
              }  

sequences = set()

while i < num_evals:
        n_parameter_1 = random.choice(parameters['n_parameter_1'])
        n_parameter_2 = random.choice(parameters['n_parameter_2'])
        n_parameter_3 = random.choice(parameters['n_parameter_3'])
        sequence = (n_parameter_1, n_parameter_2, n_parameter_3)
        if sequence not in sequences:
            sequences.add(sequence)
            i += 1

Цикл for был заменен циклом while, чтобы обеспечить условное приращение.

Спасибо, это было достаточно легко понять, я мог адаптировать это, чтобы вписаться в мои процессы, и обновить его.

Edd 13.06.2023 22:01

Вы можете использовать random.sample, чтобы получить неповторяющийся набор значений из списка всех возможностей. Но для вашего сценария генерация списка возможностей может быть непомерно высокой (только в вашем примере будет 275576 ​​записей в этом списке).

random.sample может эффективно работать с диапазонами, поэтому, если вы напишите функцию для преобразования номера индекса в соответствующую комбинацию параметров, вы можете построить список индексов комбинаций, используя random.sample(range(275576),num_evals), а затем преобразовать эти индексы в фактические значения параметров:

def paramRange(params): # index range of all combinations
    count = 1
    for r in params.values():
        count *= len(r)
    return range(count)

def getParams(params,index): # parameter value combination at index
    result = []
    for r in reversed([*params.values()]):
        index,pIndex = divmod(index,len(r))
        result.append(r[pIndex])
    return dict(zip(params,reversed(result)))

выход:

num_evals = 10 #2500

parameters = {
        'n_parameter_1': range(2,100),
        'n_parameter_2': range(1,20),
        'n_parameter_3': range(2,150),
              }

import random

comboIndexes = random.sample(paramRange(parameters),num_evals)
for index in comboIndexes:
    print(getParams(parameters,index))
        
{'n_parameter_1': 31, 'n_parameter_2': 12, 'n_parameter_3': 14}
{'n_parameter_1': 18, 'n_parameter_2': 12, 'n_parameter_3': 15}
{'n_parameter_1': 11, 'n_parameter_2': 15, 'n_parameter_3': 74}
{'n_parameter_1': 21, 'n_parameter_2': 19, 'n_parameter_3': 78}
{'n_parameter_1': 25, 'n_parameter_2': 12, 'n_parameter_3': 94}
{'n_parameter_1': 52, 'n_parameter_2': 6, 'n_parameter_3': 40}
{'n_parameter_1': 57, 'n_parameter_2': 8, 'n_parameter_3': 53}
{'n_parameter_1': 85, 'n_parameter_2': 12, 'n_parameter_3': 133}
{'n_parameter_1': 66, 'n_parameter_2': 1, 'n_parameter_3': 60}
{'n_parameter_1': 19, 'n_parameter_2': 13, 'n_parameter_3': 80}    

С помощью этого метода вы не ограничены диапазонами для словаря parameters, у вас могут быть списки конкретных значений с разными типами данных.

Спасибо, это отличный ответ, это действительно помогло/вдохновило меня на другую проблему.

Edd 13.06.2023 22:04

Другие вопросы по теме