numpy.random.seed (0)의 기능은 무엇입니까?


282

무엇 않습니다 np.random.seedScikit-알아 튜토리얼 코드 아래에 무엇입니까? 나는 NumPy의 랜덤 상태 생성기에 익숙하지 않으므로 평신도의 용어 설명에 감사드립니다.

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

답변:


557

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/urandomWindows 아날로그 또는 Windows 아날로그 에서 얻은 임의의 숫자로 설정 하거나, 둘 중 어느 것도 사용할 수 없으면 시계를 사용합니다.

시드를 사용하여 의사 난수를 생성하는 방법에 대한 자세한 정보는 Wikipedia를 참조하십시오 .


86
이 답변은 numpy 문서에 추가해야합니다. 감사합니다.
gorjanz 2012 년

8
또한을 호출 numpy.random.seed(None)하면 "사용 가능한 경우 / dev / urandom (또는 Windows 아날로그)에서 데이터를 읽거나 시계에서 시드를 시도합니다".
조나단

1
@Jonathan 우수한 점 numpy.random.seed(None). 해당 정보와 문서 링크로 답변을 업데이트했습니다.
John1024

@ curio1729 구현은 운영 체제마다 다를 수 있지만 numpy는을 (를) 포함한 명령을 만들려고 시도합니다 seed.
John1024

1
좋은 지적이야! 더 완벽하고 정확하기 위해 오프셋이 추가되었다고 언급해야합니다. 답변이 업데이트되었습니다. 더 자세한 정보를 원하는 사람들을 위해 의사 난수 생성기에 대한 Wikipedia의 토론 링크를 추가했습니다.
John1024

38

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]

3
np.random시드가 변경 될 때까지 모든 후속 호출에 대해 임의의 시드가 설정되도록 한 번만 호출 할 수있는 기능이 있습니까? 매번 전화를 거는 것은 불필요하게 장황하고 잊기 쉬운 것 같습니다.
Lubed Up Slug 4

@LubedUpSlug 당신은 그것들을 꾸밀 수 있습니다 – 적어도 테스트 한 간단한 경우에는 작동합니다. 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을 교체하고)
세바스찬 HOFFNER에게

1
@ SebastianHöffner는 귀하의 의견에 감사드립니다. 내 질문은 내가 문장 혼란 때문에 조금 잘못이었다 "그러나 다양한 랜덤 기능을 사용하면 방금, 결과는 여전히 다를 수를 호출하는 경우,"호출 np.random.seed()프로그램의 시작에 한번 항상 동일한 결과를 생성합니다 에 대한 후속 호출 이후 같은 종자에 대한 np.random기능을 결정 론적으로 후속 호출에 대한 씨앗을 변경합니다. 함수를 호출 np.random.seed()하기 전에 호출하면 np.random원하지 않는 결과가 발생할 수 있습니다.
Lubed Up Slug

17

언급했듯이 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가 작동하는 방식으로 인해 몇 번의 첫 번째 반복에 대해 균일하지 않은 분포가 발생할 수 있지만 알고리즘에 따라 다릅니다. , 그리고 현재의 걱정과이 질문의 범위를 벗어납니다.


12

나는 이것을 신경망에서 매우 자주 사용했습니다. 신경망 훈련을 시작할 때 가중치를 무작위로 초기화하는 것으로 잘 알려져 있습니다. 모델은 특정 데이터 세트에서 이러한 가중치에 대해 학습합니다. 신기원의 수 후에 당신은 훈련 된 무게 세트를 얻습니다.

이제 처음부터 다시 훈련을 원하거나 결과를 재현하기 위해 모델을 다른 사람에게 전달한다고 가정하면 가중치는 다시 이전의 숫자와는 다른 임의의 숫자로 다시 초기화됩니다. 이전과 동일한 수의 에포크 (동일한 데이터 및 기타 매개 변수 유지) 후 얻은 학습 된 가중치는 다릅니다. 문제는 모델을 처음부터 훈련시킬 때마다 모델이 더 이상 재현성이 없다는 것입니다. 모델이 매번 다른 임의의 숫자로 초기화되기 때문입니다.

처음부터 훈련을 시작할 때마다 모델이 동일한 임의의 초기 가중치 세트로 초기화되면 어떻게됩니까? 이 경우 모델을 재현 할 수 있습니다. 이것은 numpy.random.seed (0)에 의해 달성됩니다. seed ()를 특정 숫자로 언급하면 ​​항상 동일한 난수 세트에 매달립니다.


3

누군가 "무작위"숫자로 무언가를 코딩하는 방법을 보여주고 있다고 상상해보십시오. numpy seed를 사용하면 동일한 seed 번호를 사용하고 동일한 "random"숫자 세트를 얻을 수 있습니다.

알고리즘이 숫자를 뱉어 내기 때문에 정확히 임의적이지는 않지만 무작위로 생성 된 무리처럼 보입니다.


0

난수 시드는 컴퓨터가 난수 시퀀스를 생성 할 때 시작점을 지정합니다.

예를 들어 Excel에서 난수를 생성하려고한다고 가정합니다 (참고 : Excel은 시드에 대해 9999의 제한을 설정합니다). 프로세스 중에 난수 시드 상자에 숫자를 입력하면 동일한 난수 세트를 다시 사용할 수 있습니다. 상자에 "77"을 입력하고 다음에 난수 생성기를 실행할 때 "77"을 입력하면 Excel에 동일한 난수 집합이 표시됩니다. "99"를 입력하면 완전히 다른 숫자 집합을 얻게됩니다. 그러나 77의 시드로 되 돌리면 시작한 것과 동일한 난수 세트를 얻게됩니다.

예를 들어 "숫자 x를 취하고 900 + x를 더한 다음 52를 뺍니다." 프로세스를 시작하려면 시작 번호 x (시드)를 지정해야합니다. 시작 번호 77을 봅시다 :

더하기 900 + 77 = 977 빼기 52 = 925 동일한 알고리즘에 따라 두 번째 "임의"숫자는 다음과 같습니다.

900 + 925 = 1825 빼기 52 = 1773이 간단한 예는 패턴을 따르지만 컴퓨터 번호 생성의 알고리즘은 훨씬 더 복잡합니다


0

특정 시드 값을 설정 한 후 생성 된 모든 난수는 모든 플랫폼 / 시스템에서 동일합니다.



0
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])되지만 이제는 위와 같은 출력이 아닙니다.


0

위의 모든 답변 np.random.seed()은 코드 구현을 보여줍니다 . 나는 그것이 실제로 일어나는 이유를 간단히 설명하기 위해 최선을 다할 것입니다. 컴퓨터는 사전 정의 된 알고리즘을 기반으로 설계된 기계입니다. 컴퓨터의 모든 출력은 입력에 구현 된 알고리즘의 결과입니다. 따라서 컴퓨터에서 임의의 숫자를 생성하도록 요청하면 임의의 숫자가 생성되지만 컴퓨터는 임의의 숫자를 임의로 생성하지 않았습니다!

따라서 우리 np.random.seed(any_number_here)가 알고리즘 을 작성할 때 인수에 고유 한 특정 숫자 세트가 출력됩니다 any_number_here. 올바른 인수를 전달하면 특정 난수 세트를 얻을 수있는 것과 거의 같습니다. 그러나이를 위해서는 알고리즘이 작동하는 방식에 대해 알아야합니다.

예를 들어 np.random.seed(10)내가 얻은 특정 숫자 집합을 작성 하면 알고리즘이 변경되지 않는 한 10 년 후에 동일한 줄을 실행하더라도 동일한 상태로 유지됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.