본문 바로가기
PROGRAMMING/MATLAB

[MATLAB] Random Seed 지정

by BLADEBONE 2015. 1. 5.

MATLAB에서 rand, randi, randn 함수를 이용해 random number를 생성하는 경우, reproducible research 관점에서 생성되는 random number를 고정하고 싶을 때가 있다. 이를 위해서는 이전의 프로그램 언어들과 유사하게 MATLAB에서도 random number 생성에 관여하는 random seed를 고정함으로써 생성되는 값을 조정할 수 있다.


먼저 기존에 사용하던 형태는 아래와 같다.


>> randn('seed', 0)

>> randn(1,5)


ans =


    1.1650    0.6268    0.0751    0.3516   -0.6965



MATLAB R2010b 기준[각주:1]으로 RandStream을 이용하여 random seed를 고정할 수 있다.

>> s = RandStream('mcg16807', 'Seed', 0)

s = 

mcg16807 random stream
             Seed: 0
         RandnAlg: Polar
>> RandStream.setDefaultStream(s)
>> randn(1,5)

ans =

    1.1650    0.6268    0.0751    0.3516   -0.6965


RandStream 클래스에 대한 소개는 MATLAB 내의 Help를 참조하면 되겠다. 참고로 random number generation을 위한 algorithm이 여러개가 있는데 앞선 예에서 사용한 'mcg16807'이 바로 이 알고리즘의 키워드에 해당하며, 이 외에도 'mt19937ar', 'mlfg6331_64', 'mrg32k3a', 'shr3cong', 'swb2712'가 있다(RandStream.list 참고). 각 방법에 대한 차이는 Help에 나와 있다. MATLAB에서 Default로 설정된 방법은 'mt199937ar'이며, 이를 확인하기 위해서는 MATLAB 실행 후 아래와 같이 입력하면 확인할 수 있다.

>> RandStream.getDefaultStream

ans = 

mt19937ar random stream (current default)
             Seed: 0
         RandnAlg: Ziggurat


아래 코드는 11개의 random number를 생성하고 이를 간단히 출력해 보는 것으로, random seed를 지정하였기 때문에, 그대로 실행할 경우 코드 아래의 그림과 동일한 결과를 얻을 수 있게 된다.

s = RandStream('mcg16807', 'Seed', 0)
RandStream.setDefaultStream(s)
y = randn(1,11)
plot(1:11, y, 'o:')
axis([0 12 -2 2])

< 11개의 random number 출력 >


더불어 rand seed는 앞서 언급된 random number 생성 함수 뿐만 아니라 randperm 함수에도 영향을 주며, 그 결과 randperm 함수를 사용하는 crossvalind 함수에도 영향을 주게 된다. 즉, crossvalind 함수 사용시에도 random seed를 지정하게 되면, 동일한 cross-validation indices를 생성하게 된다. 

마지막으로 reproducible research를 위해서는 간단한 실험의 경우라도, random number를 생성하는 경우에는 seed를 고정하여 사용하는 편이 좋다고 생각된다. 





  1. 언제부터 적용되었는지 미확인 [본문으로]
반응형

댓글