Что делает numpy.random.seed(0)?

Что делает np.random.seed в приведенном ниже коде из учебника Scikit-Learn? Я не очень хорошо знаком с генератором случайных состояний NumPy, поэтому я очень благодарен за объяснение этого непрофессионала.

np.random.seed(0)
indices = np.random.permutation(len(iris_X))

Ответ 1

np.random.seed(0) делает непредсказуемые случайные числа

>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55,  0.72,  0.6 ,  0.54])
>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55,  0.72,  0.6 ,  0.54])

При посеве reset (каждый раз) каждый раз будет отображаться один и тот же набор чисел.

Если случайное семя не reset, с каждым вызовом появляются разные числа:

>>> numpy.random.rand(4)
array([ 0.42,  0.65,  0.44,  0.89])
>>> numpy.random.rand(4)
array([ 0.96,  0.38,  0.79,  0.53])

(псевдо) случайные числа работают, начиная с числа (семени), умножая его на большое число, затем беря по модулю этого произведения. Полученное число затем используется как семя для генерации следующего "случайного" числа. Когда вы устанавливаете семя (каждый раз), он делает то же самое каждый раз, предоставляя вам одинаковые номера.

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

Чтобы получить самые случайные числа для каждого прогона, вызовите numpy.random.seed(). Это приведет к тому, что numpy установит семя на случайное число, полученное из /dev/urandom или его аналога Windows, или, если ни один из них не доступен, будет использовать часы.

Ответ 2

Как отмечено, numpy.random.seed(0) устанавливает случайное семя в 0, поэтому псевдослучайные числа, которые вы получаете от случайного, начинаются с одной и той же точки. Это может быть полезно для отладки в некоторых случаях. ОДНАКО, после некоторого чтения это кажется неправильным способом пойти на него, если у вас есть потоки, потому что он не является потокобезопасным.

из differences-between-numpy-random-and-random-random-in-python:

Для numpy.random.seed() основная трудность заключается в том, что это не поточно-безопасный - то есть, это небезопасно использовать, если у вас много разных потоки исполнения, поскольку он не гарантированно работает, если два различные потоки выполняют функцию одновременно. Если вы не используете потоки, и если вы можете разумно ожидать, что вы не нужно будет переписывать вашу программу таким образом в будущем, numpy.random.seed() должно быть хорошо для целей тестирования. Если есть любая причина подозревать, что вам понадобятся потоки в будущем, это гораздо безопаснее в долгосрочной перспективе сделать так, как было предложено, и сделать локальный экземпляр класса numpy.random.Random. Насколько я могу судить, random.random.seed() является потокобезопасным (или, по крайней мере, я не нашел никаких свидетельства об обратном).

пример того, как это сделать:

from numpy.random import RandomState
prng = RandomState()
print prng.permutation(10)
prng = RandomState()
print prng.permutation(10)
prng = RandomState(42)
print prng.permutation(10)
prng = RandomState(42)
print prng.permutation(10)

может дать:

[3 0 4 6 8 2 1 9 7 5]

[1 6 9 0 2 7 8 3 5 4]

[8 1 5 0 7 2 9 4 3 6]

[8 1 5 0 7 2 9 4 3 6]

Наконец, обратите внимание, что могут быть случаи, когда инициализация до 0 (в отличие от семени, которая имеет не все биты 0) может привести к неравномерным распределениям для нескольких первых итераций из-за того, как работает xor, но это зависит по алгоритму и выходит за рамки моих текущих проблем и объема этого вопроса.

Ответ 3

Если вы устанавливаете np.random.seed(a_fixed_number) каждый раз, когда вы вызываете numpy другую случайную функцию, результат будет таким же:

введите описание изображения здесь

Однако, если вы просто назовете его один раз и используете различные случайные функции, результаты все равно будут отличаться:

введите описание изображения здесь

Ответ 4

Используя np.Random.Seed(i), где "i" может быть любым целым числом, вы убедитесь, что при генерации случайных чисел вы   генерирует один и тот же набор чисел в другой последовательности каждый раз, пока не будет предоставлено следующее семя