답변:
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])
시드 재설정 (매번)을 사용할 때마다 동일한 숫자 세트가 나타납니다.
임의의 시드가 재설정되지 않으면 호출 할 때마다 다른 숫자가 나타납니다.
>>> 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 아날로그 또는 Windows 아날로그 에서 얻은 임의의 숫자로 설정 하거나, 둘 중 어느 것도 사용할 수 없으면 시계를 사용합니다.
시드를 사용하여 의사 난수를 생성하는 방법에 대한 자세한 정보는 Wikipedia를 참조하십시오 .
numpy.random.seed(None)
하면 "사용 가능한 경우 / dev / urandom (또는 Windows 아날로그)에서 데이터를 읽거나 시계에서 시드를 시도합니다".
numpy.random.seed(None)
. 해당 정보와 문서 링크로 답변을 업데이트했습니다.
seed
.
np.random.seed(a_fixed_number)
numpy의 다른 임의 함수를 호출 할 때마다 를 설정하면 결과는 동일합니다.
>>> import numpy as np
>>> np.random.seed(0)
>>> perm = np.random.permutation(10)
>>> print perm
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0)
>>> print np.random.permutation(10)
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0)
>>> print np.random.permutation(10)
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0)
>>> print np.random.permutation(10)
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0)
>>> print np.random.rand(4)
[0.5488135 0.71518937 0.60276338 0.54488318]
>>> np.random.seed(0)
>>> print np.random.rand(4)
[0.5488135 0.71518937 0.60276338 0.54488318]
그러나 한 번만 호출하고 다양한 임의 함수를 사용하면 결과가 여전히 다릅니다.
>>> import numpy as np
>>> np.random.seed(0)
>>> perm = np.random.permutation(10)
>>> print perm
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0)
>>> print np.random.permutation(10)
[2 8 4 9 1 6 7 3 0 5]
>>> print np.random.permutation(10)
[3 5 1 2 9 8 0 6 7 4]
>>> print np.random.permutation(10)
[2 3 8 4 5 1 0 6 9 7]
>>> print np.random.rand(4)
[0.64817187 0.36824154 0.95715516 0.14035078]
>>> print np.random.rand(4)
[0.87008726 0.47360805 0.80091075 0.52047748]
np.random
시드가 변경 될 때까지 모든 후속 호출에 대해 임의의 시드가 설정되도록 한 번만 호출 할 수있는 기능이 있습니까? 매번 전화를 거는 것은 불필요하게 장황하고 잊기 쉬운 것 같습니다.
def seed_first(fun, seed=0):
| \tdef wrapped(*args, **kwargs):
| \t\tnp.random.seed(seed)
| \t\treturn fun(*args, **kwargs)
| \treturn wrapped
을 누른 다음 for m in np.random.__all__:
| \tif m != 'seed':
| \t\tsetattr(np.random, m, seed_first(getattr(np.random, m)))
그러나 이것은 장기적으로 매우 미묘한 버그와 이상한 행동으로 이어질 수 있습니다. | (... 줄 바꿈 4 개의 공백 \ t을 교체하고)
np.random.seed()
프로그램의 시작에 한번 항상 동일한 결과를 생성합니다 에 대한 후속 호출 이후 같은 종자에 대한 np.random
기능을 결정 론적으로 후속 호출에 대한 씨앗을 변경합니다. 함수를 호출 np.random.seed()
하기 전에 호출하면 np.random
원하지 않는 결과가 발생할 수 있습니다.
언급했듯이 numpy.random.seed (0)은 임의의 시드를 0으로 설정하므로 임의에서 얻은 의사 난수는 동일한 지점에서 시작합니다. 경우에 따라 디버깅에 유용 할 수 있습니다. 그러나 스레드를 안전하게 읽지 못했기 때문에 스레드가있는 경우이를 읽은 후에는 잘못된 방법으로 보입니다.
에서 차이 - 사이 NumPy와 -에 - 파이썬 임의 임의 임의 앤 :
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)
줄 수 있습니다 :
[3000 6 8 2 9 7 5]
[1 6 9 0 2 7 8 3 5 4]
[8 15 7 2 9 4 3 6]
[8 15 7 2 9 4 3 6]
마지막으로, 0으로 초기화하면 모든 비트가 0이 아닌 시드와 달리 xor가 작동하는 방식으로 인해 몇 번의 첫 번째 반복에 대해 균일하지 않은 분포가 발생할 수 있지만 알고리즘에 따라 다릅니다. , 그리고 현재의 걱정과이 질문의 범위를 벗어납니다.
나는 이것을 신경망에서 매우 자주 사용했습니다. 신경망 훈련을 시작할 때 가중치를 무작위로 초기화하는 것으로 잘 알려져 있습니다. 모델은 특정 데이터 세트에서 이러한 가중치에 대해 학습합니다. 신기원의 수 후에 당신은 훈련 된 무게 세트를 얻습니다.
이제 처음부터 다시 훈련을 원하거나 결과를 재현하기 위해 모델을 다른 사람에게 전달한다고 가정하면 가중치는 다시 이전의 숫자와는 다른 임의의 숫자로 다시 초기화됩니다. 이전과 동일한 수의 에포크 (동일한 데이터 및 기타 매개 변수 유지) 후 얻은 학습 된 가중치는 다릅니다. 문제는 모델을 처음부터 훈련시킬 때마다 모델이 더 이상 재현성이 없다는 것입니다. 모델이 매번 다른 임의의 숫자로 초기화되기 때문입니다.
처음부터 훈련을 시작할 때마다 모델이 동일한 임의의 초기 가중치 세트로 초기화되면 어떻게됩니까? 이 경우 모델을 재현 할 수 있습니다. 이것은 numpy.random.seed (0)에 의해 달성됩니다. seed ()를 특정 숫자로 언급하면 항상 동일한 난수 세트에 매달립니다.
난수 시드는 컴퓨터가 난수 시퀀스를 생성 할 때 시작점을 지정합니다.
예를 들어 Excel에서 난수를 생성하려고한다고 가정합니다 (참고 : Excel은 시드에 대해 9999의 제한을 설정합니다). 프로세스 중에 난수 시드 상자에 숫자를 입력하면 동일한 난수 세트를 다시 사용할 수 있습니다. 상자에 "77"을 입력하고 다음에 난수 생성기를 실행할 때 "77"을 입력하면 Excel에 동일한 난수 집합이 표시됩니다. "99"를 입력하면 완전히 다른 숫자 집합을 얻게됩니다. 그러나 77의 시드로 되 돌리면 시작한 것과 동일한 난수 세트를 얻게됩니다.
예를 들어 "숫자 x를 취하고 900 + x를 더한 다음 52를 뺍니다." 프로세스를 시작하려면 시작 번호 x (시드)를 지정해야합니다. 시작 번호 77을 봅시다 :
더하기 900 + 77 = 977 빼기 52 = 925 동일한 알고리즘에 따라 두 번째 "임의"숫자는 다음과 같습니다.
900 + 925 = 1825 빼기 52 = 1773이 간단한 예는 패턴을 따르지만 컴퓨터 번호 생성의 알고리즘은 훨씬 더 복잡합니다
NumPy와 워드 프로세서에 좋은 설명이있다 : https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.random.RandomState.html 그것은을 의미 메르 센 트위스터 의사 난수 생성기 . 알고리즘에 대한 자세한 내용은 https://en.wikipedia.org/wiki/Mersenne_Twister
numpy.random.seed(0)
numpy.random.randint(10, size=5)
이렇게하면 다음과 같은 결과가 array([5, 0, 3, 3, 7])
나옵니다 .
다시 같은 코드를 실행하면 동일한 결과를 얻을 수 있습니다.
이제 시드 값 0을 1 또는 다른 것으로 변경하면 :
numpy.random.seed(1)
numpy.random.randint(10, size=5)
다음과 같은 출력이 생성 array([5 8 9 5 0])
되지만 이제는 위와 같은 출력이 아닙니다.
위의 모든 답변 np.random.seed()
은 코드 구현을 보여줍니다 . 나는 그것이 실제로 일어나는 이유를 간단히 설명하기 위해 최선을 다할 것입니다. 컴퓨터는 사전 정의 된 알고리즘을 기반으로 설계된 기계입니다. 컴퓨터의 모든 출력은 입력에 구현 된 알고리즘의 결과입니다. 따라서 컴퓨터에서 임의의 숫자를 생성하도록 요청하면 임의의 숫자가 생성되지만 컴퓨터는 임의의 숫자를 임의로 생성하지 않았습니다!
따라서 우리 np.random.seed(any_number_here)
가 알고리즘 을 작성할 때 인수에 고유 한 특정 숫자 세트가 출력됩니다 any_number_here
. 올바른 인수를 전달하면 특정 난수 세트를 얻을 수있는 것과 거의 같습니다. 그러나이를 위해서는 알고리즘이 작동하는 방식에 대해 알아야합니다.
예를 들어 np.random.seed(10)
내가 얻은 특정 숫자 집합을 작성 하면 알고리즘이 변경되지 않는 한 10 년 후에 동일한 줄을 실행하더라도 동일한 상태로 유지됩니다.