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

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

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



답변

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를 참조하십시오 .


답변

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]


답변

언급했듯이 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 ()를 특정 숫자로 언급하면 ​​항상 동일한 난수 세트에 매달립니다.


답변

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

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


답변

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

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

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

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

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


답변

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