numpy.random.seed(0)의 역할은 무엇입니까?
뭐 하는 거야?
np.random.seed(0)
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])
(seed-)는 숫자(시드)로 시작하여 큰 숫자를 곱하고 오프셋을 추가한 다음 해당 합계의 모듈로를 취함으로써 작동합니다.그 결과 얻은 숫자는 다음 "랜덤" 번호를 생성하기 위한 시드로 사용됩니다.시드를 설정하면 시드는 매번 같은 동작을 하여 같은 수치를 얻을 수 있습니다.
무작위로 보이는 숫자를 원하는 경우 시드를 설정하지 마십시오.단, 디버깅할 랜덤 번호를 사용하는 코드가 있는 경우 매번 실행할 때마다 코드가 동일한 작업을 수행하도록 각 실행 전에 시드를 설정하는 것이 매우 유용합니다.
실행에서 를 하십시오.numpy.random.seed()
이것에 의해, numpy는, 시드를 임의의 수치로 설정합니다./dev/urandom
또는 Windows 아날로그 또는 둘 다 사용할 수 없는 경우 클럭을 사용합니다.
시드를 사용하여 의사 난수를 생성하는 방법에 대한 자세한 내용은 위키피디아를 참조하십시오.
「 」를 는,np.random.seed(a_fixed_number)
함수를 numpy 다 른 른 른 른 른 른 른 른 른 른 every every every every every every every every every every every every every every every every every every every every every every every every every every every
>>> 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-py-discription-in-discriptions의 차이로부터:
numpy.random.seed()의 경우 가장 큰 어려움은 스레드 안전성이 없다는 것입니다.즉, 여러 개의 다른 실행 스레드가 있는 경우, 두 개의 다른 스레드가 동시에 기능을 실행하는 경우 동작할 수 있다는 보장이 없기 때문입니다.스레드를 사용하지 않고 있으며, 향후 이러한 방식으로 프로그램을 다시 작성할 필요가 없다고 합리적으로 예상할 수 있다면 numpy.random.seed()를 테스트 목적으로 사용하면 됩니다.향후 스레드가 필요할 것으로 생각되는 경우 numpy.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의 동작방식에 따라 몇 가지 첫 번째 반복에 대해 불균일한 분포가 발생할 수 있다는 점에 유의하십시오.이것은 알고리즘에 따라 다르며, 현재의 우려와 이 질문의 범위를 벗어납니다.
저는 이것을 신경망에서 매우 자주 사용해 왔습니다.우리가 신경 네트워크를 훈련하기 시작할 때 무작위로 체중을 초기화한다는 것은 잘 알려져 있다.모델은 특정 데이터 집합의 이러한 가중치에 대해 교육됩니다.몇 번의 에폭스 후에 훈련받은 웨이트 세트를 얻을 수 있습니다.
이제 처음부터 다시 교육하거나 다른 사람에게 모델을 전달하여 결과를 재현하려고 하면 가중치가 다시 이전의 수치와 대부분 다른 랜덤 수치로 초기화됩니다.에폭(데이터 및 기타 파라미터는 이전과 같은 수) 후에 취득된 트레이닝된 가중치는 다릅니다.문제는 모형을 처음부터 다시 교육할 때마다 서로 다른 가중치 집합을 제공하므로 모형을 더 이상 재현할 수 없다는 것입니다.그 이유는 매번 다른 난수로 모형이 초기화되기 때문입니다.
처음부터 교육을 시작할 때마다 모델이 동일한 랜덤 초기화 가중치 세트로 초기화되면 어떻게 됩니까?이 경우 모형을 재현할 수 있습니다.이것은 numpy.random.seed(0)에 의해 실현됩니다.특정 번호에 seed()를 지정함으로써 항상 같은 난수 집합에 매달리게 됩니다.
저는 정말 짧은 답변을 드리고 싶습니다.
seed
전화할 할 수 요.seed
시리즈 번호가 미리 입력되고 numpy random이 반복자를 유지하며 랜덤 번호를 얻을 때마다 get next를 호출합니다.
예:
np.random.seed(2)
np.random.randn(2) # array([-0.41675785, -0.05626683])
np.random.randn(1) # array([-1.24528809])
np.random.seed(2)
np.random.randn(1) # array([-0.41675785])
np.random.randn(2) # array([-0.05626683, -1.24528809])
시드를 에서 몇 이 numpy는 numpy로 되어 있습니다.array([-0.41675785, -0.05626683, -1.24528809])
.
위의 모든 답변은 다음과 같은 기능을 구현하고 있음을 나타냅니다.np.random.seed()
암호화되어 있습니다.왜 그런 일이 일어나는지 간략하게 설명하도록 노력하겠습니다.시스템은 미리 정의된 알고리즘을 기반으로 설계된 시스템입니다.컴퓨터로부터의 출력은 모두 입력에 구현된 알고리즘의 결과입니다.그래서 우리가 컴퓨터에 랜덤한 숫자를 생성하도록 요청할 때, 그것들이 랜덤이라는 것은 확실하지만 컴퓨터가 무작위로 그것들을 생각해 낸 것은 아니다!
쓸 는요.np.random.seed(any_number_here)
한 특정 합니다.any_number_here
이것은 우리가 올바른 인수를 통과하면 특정한 난수 집합을 얻을 수 있는 것과 거의 같다.그러나 이를 위해서는 알고리즘이 어떻게 동작하는지 알아야 합니다.이것은 매우 지루합니다.
예를 '아까'라고 '아까'라고 쓰면np.random.seed(10)
알고리즘이 변경되지 않는 한 10년 후에 같은 행을 실행해도 내가 얻은 특정 숫자의 집합은 그대로 유지됩니다.
여러분이 누군가에게 "랜덤" 번호들로 어떤 것을 코드화하는 방법을 보여주고 있다고 상상해 보세요.numpy seed를 사용함으로써 그들은 같은 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.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])
그러나 현재 출력은 위와 같지 않습니다.
특정 시드 값을 설정한 후 생성되는 모든 난수는 모든 플랫폼/시스템에서 동일합니다.
Numpy documents에는 좋은 설명이 있습니다.https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.random.RandomState.html은 Mersenne Twister 유사수 생성기를 가리킵니다.알고리즘의 상세한 것에 대하여는, https://en.wikipedia.org/wiki/Mersenne_Twister 를 참조해 주세요.
언급URL : https://stackoverflow.com/questions/21494489/what-does-numpy-random-seed0-do
'programing' 카테고리의 다른 글
생성 시 및 업데이트 시 MySQL CURRENT_TIMESTamp (0) | 2022.10.06 |
---|---|
HTML을 PHP 함수로 되돌리는 방법이 있습니까?(반환값을 문자열로 작성하지 않음) (0) | 2022.10.06 |
Vue router-link 완전 액티브클래스 (0) | 2022.10.06 |
Python 3.7 데이터 클래스 상속 (0) | 2022.10.06 |
MySQL: 자동 커밋 플래그가 켜져 있지만 트랜잭션이 롤백될 수 있습니다. (0) | 2022.10.06 |