Проблема: В настоящее время я работаю над кластеризацией данных и обнаружил странное поведение в своих ноутбуках Jupyter. Все семена зафиксированы. Многократное выполнение части или всего кода дает стабильные результаты. Перезапуск ядра приводит к изменению результатов. В любом случае эти новые результаты стабильны, пока активно ядро.
import numpy as np
import random, os
# Fix Seeds
def fix_seeds(seed=1234):
random.seed(seed)
np.random.seed(seed)
# In case the modules do something on import
fix_seeds()
# Other imports (Only depending on random and/or numpy)
Итак, мой вопрос: Как или в какой момент вводится эта случайность и как это исправить?
Да, я пробовал это несколько раз. Кажется, что переименование файла (добавление тега «копировать») является соответствующей разницей.
Хорошо, я только что проверил переименование файла... разные кластеры.
Какую версию Python вы используете? Порядок диктов гарантируется только с версии 3.7. В более ранних версиях порядок может отличаться в зависимости от сеанса. Но если перезапуск ядра не влияет на результаты или вы используете Python 3.7+, то это должно быть что-то другое.
Я использую Python 3.8.8 и ipykernel 5.3.4.
Хм, тогда я не знаю. Вам нужно создать минимальный автономный пример, который воспроизводит проблему. Не забудьте указать точные версии ваших пакетов (например, вывод pip freeze
).
Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.
По-видимому, Python> = 3.3 использует случайное хэш-семя, чтобы избежать атак столкновений. Исправление этого семени (например, выполнение PYTHONHASHSEED=0 python3 <file>.py
) решает мою проблему. То же самое касается ядер. При запуске они также генерируют Hash-Seed.
Источник: https://docs.python.org/3/using/cmdline.html#envvar-PYTHONHASHSEED
Сомневаюсь, что это связано с копированием файла. Если вы завершаете работу ядра и перезапускаете его, он по-прежнему дает те же результаты?