※ 이 포스팅은 저자 'Kirthi Raman'의 도서 <Mastering Python Data Visualization> 을 공부하며 정리한 글입니다.
Chapter 08. Advanced Visualization (고급 시각화)
Computer Simulation (컴퓨터 시뮬레이션)
컴퓨터 시뮬레이션의 모델은 알려지지 않거나 분석이 어려운 시나리오를 이해하고 평가하기 위한 방법으로서, 지난 수십 년 이상 인기를 얻은 학문이다.
또한, 컴퓨터 시뮬레이션은 물리학, 화학, 생물학, 경제학, 공학, 심리학, 사회 과학 등 다양한 분야에서 시스템의 수학적 모델링에 매우 생산적인 방법이다.
컴퓨터 시뮬레이션 모델의 장점
- 연구되고 있는 알고리즘 또는 프로세스에 대한 이해의 향상
- 프로세스 및 알고리즘의 문제 영역을 식별
- 알고리즘 / 모델에 관한 특정 변화에 대한 영향력 평가
컴퓨터 시뮬레이션 모델의 유형
- 이산 모델 : 특정 시간에 발생한 시스템의 변화들
- 연속 모델 : 일정 기간에 걸쳐 연속적으로 변화하는 시스템의 상태
- 혼합 모델 : 이산과 연속 요소를 모두 포함
시뮬레이션을 수행하기 위해, 일반적으로 임의의 확률적 입력 값을 사용한다. 이는 시뮬레이션 모델에 대응하는 실제 데이터를 갖기 어려워서이다.
#. Python's Random Package (파이썬의 랜덤 패키지)
파이썬은 여러 편리한 함수들을 가진 random 이라는 패키지를 제공한다.
- 0.0 ~ 1.0 사이 또는 특정 시작과 끝 값 사이의 임의 랜덤 실수(real numbers) 생성
- 숫자의 특정 범위 사이의 임의 랜덤 정수(integers) 생성
- 숫자 또는 문자 목록에서 임의 랜덤값 생성
import random
print random.random() # between 0.0 and 1.0
print random.uniform(2.54, 12.2) # between 2.54 and 12.2
print random.randint(5,10) # random integer between 5 and 10
print random.randrange(25) # random number between 0 and 25
# random numbers from the range of 5 to 500 with step 5
print random.randrange(5,500,5)
# three random number from the list
print random.sample([13,15,29,31,43,46,66,89,90,94], 3)
# Random choice from a list
random.choice([1, 2, 3, 5, 9])
#. SciPy's Random Functions (SciPy의 랜덤 함수)
알고리즘과 수학적 기술을 가진 NumPy 의 확장 버전이 SciPy 패키지다.
NumPy는 Built-in Pseudo Random 생성기를 제공한다. 숫자들은 Pseudo 랜덤이다.
즉, 하나의 Seed 숫자로부터 결정성을 갖고 생성된다. 따라서 같은 Seed 번호를 사용하면 같은 랜덤 숫자들을 생성할 수 있음을 참고하자.
import numpy as np
np.random.seed(10)
각기 다른 랜덤 시퀀스는 Seed 값을 설정하지 않음으로써 생성할 수 있다.
NumPy는 자동으로 랜덤 Seed를 시간 기준으로 선택한다.
np.random.seed()
구간 [0.0, 1.0] 에서 5개의 랜덤값 배열을 다음과 같이 생성할 수 있다.
np.random.rand(5)
Out[]: array([ 0.54340494, 0.27836939, 0.42451759, 0.84477613, 0.00471886])
rand 함수를 이용해 다음 코드처럼 임의의 2차원 배열을 생성할 수 있다.
np.random.rand(2, 4)
Out[]:
array([[ 0.12156912, 0.67074908, 0.82585276, 0.13670659],
[ 0.57509333, 0.89132195, 0.20920212, 0.18532822]])
임의의 랜덤 정수를 생성하기 위해 randint(min, max)를 사용할 수 있다.
min과 max는 임의 랜덤 정수를 선택하기 위한 범위다.
np.random.randint(4, 18)
Out[]: 13
Lambda = 8.0 을 가진 이산 포아송 분포(Discrete Poisson distribution)의 임의 랜덤 값은 다음과 같이 생성할 수 있다.
np.random.poisson(8.0)
Out[]: 3
표준편차(sigma) = 3.0, 평균(mu) = 1.25 를 가진 연속 정규분포(Gaussian distribution)의 임의 랜덤 값은 다음과 같이 생성할 수 있다.
np.random.normal(1.25, 3.0)
Out[]: 0.5128392013916669
#. Simulation Examples (시뮬레이션 예제)
첫 번째 예제는 확률 미분 방정식(SDE)로 주가 변동을 모델링하기 위한 기하학적 브라운 운동(Geometric Brownian Motion)이다.
기하학적 브라운 운동은 지수 브라운 운동(Exponential Brownian Motion)으로도 알려져 있다.
위 수식에서 W_t 는 브라운 운동을, mu는 percent drift, sigma는 percent volatility(변동성) 이다.
다음 코드는 브라운 운동을 시각화한 것이다.
from numpy.random import standard_normal
from numpy import zeros, sqrt
import matplotlib.pyplot as plt
S_init = 20.222
T = 1
tstep = 0.0002
sigma = 0.4
mu = 1
NumSimulation = 6
colors = [ (214,27,31), (148,103,189), (229,109,0), (41,127,214),
(227,119,194),(44,160,44),(227,119,194), (72,17,121), (196,156,148) ]
# Scale the RGB values to the [0, 1] range.
for i in range(len(colors)):
r, g, b = colors[i]
colors[i] = (r / 255., g / 255., b / 255.)
plt.figure(figsize=(12,12))
Steps = round(T/tstep); #Steps in years
S = zeros([NumSimulation, int(Steps)], dtype=float)
x = range(0, int(Steps), 1)
for j in range(0, NumSimulation, 1):
S[j,0]= S_init
for i in x[:-1]:
S[j,i+1]=S[j,i]+S[j,i]*(mu-0.5*pow(sigma,2))*tstep+ \
sigma*S[j,i]*sqrt(tstep)*standard_normal()
plt.plot(x, S[j], linewidth=2., color=colors[j])
plt.title('%d Simulation using %d Steps, \n$\sigma$=%.6f $\mu$=%.6f $S_0$=%.6f '
% (int(NumSimulation), int(Steps), sigma, mu, S_init), fontsize=18)
plt.xlabel('steps', fontsize=16)
plt.grid(True)
plt.ylabel('stock price', fontsize=16)
plt.ylim(0,90)
plt.show()
http://briansimulator.org
Animation (애니메이션)
파이썬에서 matplotlib 을 이용해 애니메이션을 만들 수 있다.
우선, 애니메이션을 생성하기 위한 기본 코드는 다음과 같다.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
# Set up the figure, axis, and the plot element to be animated
fig = plt.figure()
ax = plt.axes(xlim=(0, 3.2), ylim=(-2.14, 2.14))
line, = ax.plot([], [], lw=2)
matplotlib 에서 애니메이션 패키지를 정확히 불러오기 위해 다음과 같이 축을 설정하고, 필요한 도식화 변수(비어있는 선)를 준비한다.
# initialization function: plot the background of each frame
def init():
line.set_data([], [])
return line,
다음과 같이 모든 애니메이션을 시작하기 전 기본 프레임을 만든다.
# animation function. This is called sequentially
def animate(i):
x = np.linspace(0, 2, 1000)
xval = 2 * np.pi * (x - 0.01 * i)
y = np.cos(xval) # Here we are trying to animate cos function
line.set_data(x, y)
return line,
여기에 입력인 x 와 y 값이 변하는 것으로 정의된 프레임 번호, 도식화되는 변수들의 집합들을 포함하는 에니메이션 함수를 사용한다.
anim = animation.FuncAnimation(fig, animate, init_func=init,\
frames=200, interval=20, blit=True)
anim.save('basic_animation.html', fps=30)
실제 애니메이션 개체는 FuncAnimation 을 통해서 만들어지며,
init()와 animate() 함수에게 프레임의 개수인 fps(frames per second)와 시간 간격 파라미터를 통해 전달된다.
blit=True 파라미터는 바뀌는 부분만 다시 그려지면서 표시하는 것을 의미한다.
더 많은 예제들은 다음 블로그에서 확인할 수 있다.
http://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/
http://matplotlib.org/examples/animation/
'데이터 과학 > Mastering Python Data Visualization' 카테고리의 다른 글
Chapter 07. Bioinformatics, Genetics and Network Models (생물정보학, 유전학, 네트워크 모델) (0) | 2017.10.29 |
---|---|
Chapter 06. Statistical and Machine Learning (통계 및 머신러닝) (0) | 2017.10.29 |
Chapter 05-3. An Overview of Statistical and Machine Learning (통계 및 머신러닝 개요) (0) | 2017.10.18 |
Chapter 05-2. Stochastic Model (확률론적 모형) (0) | 2017.06.19 |
Chapter 05-1. Deterministic Model (결정론적 모형) (0) | 2017.06.18 |