NumPy 시드 고정 및 난수 배열 생성하기
데이터 분석과 머신러닝에서 재현성(reproducibility)은 매우 중요합니다. 같은 코드와 같은 데이터로 실행했을 때, 항상 동일한 결과가 나와야 실험의 신뢰성을 보장할 수 있기 때문입니다.
Python의 대표적인 수치 계산 라이브러리인 NumPy는 난수(random number)를 생성하는 기능을 제공합니다. 하지만 이 난수는 기본적으로 실행할 때마다 달라집니다. 따라서, 재현 가능한 코드를 작성하려면 난수 시드(seed)를 고정해야 합니다. 이번 포스팅에서는 NumPy에서 시드를 고정하는 방법과 난수 배열을 생성하는 다양한 방법을 알아보겠습니다.
1. 난수와 시드란?
난수란 무엇인가요?
난수는 무작위로 생성된 숫자를 말합니다. 하지만 컴퓨터에서 생성되는 난수는 완전히 무작위가 아닌, 일정한 알고리즘에 따라 생성되는 의사 난수(pseudo-random number)입니다. 이 의사 난수는 시작점(초기값)에 따라 동일한 순서로 생성됩니다.
시드란 무엇인가요?
시드(seed)는 난수를 생성하는 알고리즘의 초기값입니다. 시드를 고정하면 항상 동일한 순서의 난수가 생성됩니다. 따라서 시드를 고정하는 것은 코드를 재현 가능하게 만드는 데 매우 유용합니다.
2. NumPy에서 시드 고정하기
NumPy에서 시드를 고정하려면 numpy.random.seed()
메서드를 사용합니다. 이 메서드는 NumPy의 난수 생성기에 시드를 설정합니다.
시드 고정 예제
import numpy as np
# 시드 고정
np.random.seed(42)
# 난수 생성
random_numbers = np.random.rand(5)
print(random_numbers)
위 코드를 실행하면 항상 동일한 난수 배열이 출력됩니다:
[0.37454012 0.95071431 0.73199394 0.59865848 0.15601864]
3. NumPy로 난수 배열 생성하기
NumPy는 다양한 종류의 난수를 생성할 수 있는 메서드를 제공합니다. 대표적인 메서드는 다음과 같습니다:
3.1 numpy.random.rand()
0과 1 사이의 균등 분포에서 난수를 생성합니다.
사용 예제
# 1차원 배열 생성
array_1d = np.random.rand(5)
print(array_1d)
# 2차원 배열 생성
array_2d = np.random.rand(3, 4)
print(array_2d)
출력 예시
[0.15599452 0.05808361 0.86617615 0.60111501 0.70807258]
[[0.02058449 0.96990985 0.83244264 0.21233911]
[0.18182497 0.18340451 0.30424224 0.52475643]
[0.43194502 0.29122914 0.61185289 0.13949386]]
3.2 numpy.random.randint()
지정한 범위 내에서 정수 난수를 생성합니다.
사용 예제
# 1차원 배열 생성
int_array_1d = np.random.randint(0, 10, size=5)
print(int_array_1d)
# 2차원 배열 생성
int_array_2d = np.random.randint(0, 100, size=(3, 4))
print(int_array_2d)
출력 예시
[3 7 6 2 5]
[[57 96 59 94]
[94 43 88 61]
[99 92 64 71]]
3.3 numpy.random.normal()
정규 분포(가우시안 분포)에서 난수를 생성합니다.
사용 예제
# 평균 0, 표준편차 1인 정규분포에서 난수 생성
normal_array = np.random.normal(0, 1, size=(3, 4))
print(normal_array)
출력 예시
[[ 0.49671415 -0.1382643 0.64768854 1.52302986]
[-0.23415337 -0.23413696 1.57921282 0.76743473]
[-0.46947439 0.54256004 -0.46341769 -0.46572975]]
3.4 numpy.random.choice()
주어진 배열에서 무작위로 샘플을 선택합니다.
사용 예제
# 배열에서 무작위로 3개 선택
sample = np.random.choice([1, 2, 3, 4, 5], size=3, replace=False)
print(sample)
# 배열에서 중복 허용하여 5개 선택
sample_with_replacement = np.random.choice([1, 2, 3, 4, 5], size=5, replace=True)
print(sample_with_replacement)
출력 예시
[3 1 5]
[4 4 2 1 5]
4. 시드 고정의 활용 예
시드 고정은 다음과 같은 경우에 유용합니다:
- 모델 학습 및 테스트: 머신러닝 모델을 학습하고 테스트할 때, 동일한 데이터 분할이 필요할 경우.
- 디버깅: 난수를 사용하는 코드를 디버깅할 때, 동일한 결과를 재현하여 문제를 파악할 수 있음.
- 결과 비교: 여러 알고리즘의 성능을 비교할 때, 동일한 초기 조건을 설정하여 공정한 비교 가능.
5. 결론
NumPy의 난수 생성 기능은 매우 강력하며, 다양한 시나리오에서 활용될 수 있습니다. 하지만 재현성을 위해 항상 시드를 고정하는 습관을 가지는 것이 중요합니다. 이번 포스팅에서는 시드를 고정하는 방법과 난수 배열을 생성하는 다양한 방법을 알아보았습니다. 앞으로 NumPy를 활용한 데이터 분석이나 머신러닝 프로젝트에서 이를 적극 활용해 보세요!
'Python > NumPy' 카테고리의 다른 글
NumPy로 배우는 선형대수 기초 (0) | 2025.10.12 |
---|---|
NumPy로 분포별 난수 생성하기 (0) | 2025.10.11 |
NumPy 난수 생성 (random 모듈 사용) (0) | 2025.10.09 |
NumPy 누적 함수: cumsum과 cumprod (0) | 2025.10.08 |
NumPy를 활용한 수학적 함수 적용 (0) | 2025.10.07 |