20 분 소요

👨‍💻🏫KNU 2022-2 SW & media 문제해결프로그래밍 1,2,3

제 1강

문제해결의 과정

문제해결의 과정은 문제 및 목적 설정의 순서는 다음과 같이 이루어진다

  1. 데이터 전처리 및 분석
  2. 모델설정 변수추정
  3. 성능평가

문제해결의 목적은 분석 / 예측 / 최적화로 나누어진다.

모델 특징과 선택

복잡도 모델 특징
단순-적합성과 정확도가 낮다, 과소적합되기 쉽다 수학모델 원리 이해
  통계모델 통계적 추론
복잡-적합성과 정확도가 높다, 과대적합되기 쉽다. 머신러닝 응용지향형 모델

뜨거운 샤워물의 법칙

  • 샤워기의 온도 조절기를 통해 내가 원하는 온도를 찾을 수있는가
  • 내가 원하는 온도에 도달하려면 얼마나 많은 시간이 걸리는가
  • 내가 원하는 물의 온도와 현재 물의 온도 차이 만큼 뜨거우면 차갑게, 차가우면 뜨겁게 레버를 반대로 돌린다.
\[\dot{x}(t)=-ax(t-h)\]

수학적 해결 방법 : 수리 모델링

  • 실세계 현상 (문제 상황)

-> 알고리즘 개발 (관찰 및 표현 단순화, 형식화, ex:각 재질 그물 별 어획량)

  • 수학적 모델

-> 풀이 (수학적 분석, ex:어획시행횟수, 어획중량, 평균중량)

  • 수학적 결과 (모델내에서의 해)

-> 현상해석

ex:
->집단간 비교가 가장 쉬운 방법은 -> 평균
->평균이 차이가 있는지 없는지 알 수있는 방법
->통계의 가설 검정 방법으로 Kruskal-Wallis H 검정을 사용한다.

  • 결론 예측 (판단)

-> 검증 (타당성과 정확성, ex:그룹간평균차이, 통계량, p-value로 모델의 성능을 평가, 검증 실시)

  • 실세계 현상 (문제 상황)

통계적 해결 방법 : 가설 검정, 통계분석

  • 문제정의

-> 모집단의 정의, 표본추출(ex: 지역별 SFTS 발병률)

  • 데이터 수집

-> 통계처리, 컴퓨터 입력, 수행(ex: 기간별 SFTS 발병시 기상자료)

  • 데이터 정리 및 분석

-> 결론 유도(ex: UnivariateFeatureSelection, Correlation)

  • 분석결과 해석 및 의사결정

-> 문제의 반영 및 조치(ex: MSE, RMSE, R2, FeatureImportance산정 등)

  • 문제정의

머신러닝적 해결 방법

1. 문제의 이해

  • 문제이해(배경, 목적, 유형)
  • 평가지표(평가방법, 평가기준)

2.  탐색적 데이터 분석

  • 데이터 구조 탐색
  • 데이터 시각화(중요 피처 파악)

3. 베이스라인 모델

  • 모델 훈련 및 성능 검증
  • 결과 예측 및 제출

4. 성능 개선

  • 피처엔지니어링
  • 하이퍼파라미터 최적화
  • 성능검증(피처엔지니어링, 데이터시각화, 평가지표 파악)
  • 결과 예측 및 제출
분류 종류
분류와 회귀 회귀평가지표
분류 평가지표 오차행렬(정확도, 정밀도, 재현율, F1점수), 로그손실, ROC
데이터인코딩 레이블인코딩, 원-핫인코딩
피처스케일링 min_max정규화, 표준화
교차검증 Kfold, 층화Kfold
주요머신러닝모델 선형회귀, 로지스틱회귀, 결정트리, 앙상블, 랜덤포레스트, XGBoost, LightGBM
하이퍼파리미터 최적화 그리드서치, 랜덤서치, 베이지안 최적화

제 2강

문제설정

  1. 코로나19감염병 확산과정을 데이터를 통해 관찰하고 확산양산을 모델로 나타낸다.
  2. 코로나 확산은 어떻게 결정되는가? 질병은 시간이 지나면 사라지는가?
  3. 감염병이 발생했을시 확산을 늦추는 방법으로는 어떤것이 있는가? 그 방법의 효과는
  4. 백신접종의 효과와 환자 감소율을 비교하여 어떤것이 더 효과적인지 알아본다
  5. 백신의 효과적인 접종시기는?
  6. 적합한 사회적거리두기 단계 산정, 앞으로의 감염자수 양상 예측

1.코로나19감염병 확산과정을 데이터를 통해 관찰하고 확산양산을 모델로 나타내기

코로나19감염자 수에 대한 데이터 코로나19수학모델

감염병의 특징

  • 누가 어떻게 감염되는가?
  • 누가 감염시키는가?
  • 회복이 가능한가?
  • 회복후 재감염이 가능한가?

감염병자 수 수학모델

  • $S$: 감염될 수 있는 그룹
  • $I$: 감염된 그룹
  • $R$: 회복된 그룹

일때

  • $\Delta$I: 다음 날 감염된 사람 수의 변화량
  • $N$: 전체 인구수
  • $a$: 하루간 감염자가 사람을 마주치는 평균횟수
  • p: 감염자가 접촉 했을때의 감염시키는 확률
  • $\beta$: 하루간 감염자가 사람을 마주치는 평균횟수 * 감염시키는 확률; 감염상수$\beta=ap$

새로 감염된 사람 수는 $\beta(\frac{S}{N})I$

  • $\gamma$: 회복률

감염되었다가 회복된 사람 수는 $\gamma I$

따라서 이산 모형으로 나타낸 SIR모델은 다음과 같다.

$S_{t+1} = S_t - \beta S_t \frac{I_t}{N}$
$I_{t+1} = I_t + \beta S_t \frac{I_t}{N} - \gamma I_t$
$R_{t+1} = R_t + \gamma I_t$

이를 연속 모형(상미분방정식)으로 나타내면 다음과 같다.

$\frac{d}{dt} S(t)= -\beta S(t) \frac{I(t)}{N}$
$\frac{d}{dt} I(t)= \beta S \frac{I}{N} - \gamma I(t)$
$\frac{d}{dt} R(t)= \gamma I(t)$

파이썬으로 시뮬레이션 해보기

만들어진 모델과 테일러급수, 룽게-쿠타 방법을 이용하여 파이썬으로 시뮬레이션을 해보도록 한다.

#defining the parameters
#time step
t0=0 #start time
tf=14 #end time
n=140 #number of time steps
h=(tf-t0)/n #time step size
time=np.linspace(t0,tf,n+1)

#condition parameters S,I,R
N=51839994 #from 2020 korea population
case1=6#from first covid infection of korea
init_values=1000=np.array([N,case,0])
x=np.array((n+1)*([init_values]))

#model parameters
beta=0.4
gamma=1/14

룽게-쿠타 방법을 이용하여 시뮬레이션을 해보면 다음과 같다.

$RK4$
$k_1 = f(t_i, y_i)$
$k_2 = f(t_i + \frac{h}{2}, y_i + \frac{k_1 h}{2})$
$k_3 = f(t_i + \frac{h}{2}, y_i + \frac{k_2 h}{2})$
$k_4 = f(t_i + h, y_i + k_3h)$
$y_{i+1} = y_i + \frac{1}{6}(k_1 + 2k_2 + 2k_3 + k_4)h$

#k1=[dS, dI, dR]
for i in range(n):
    S=x[i,0]
    I=x[i,1]
    R=x[i,2]
    dS=-beta*S*I/N
    dI=beta*S*I/N-gamma*I
    dR=gamma*I
    k1=np.array([dS,dI,dR])

    S=x[i,0]+k1[0]*h/2
    I=x[i,1]+k1[1]*h/2
    R=x[i,2]+k1[2]*h/2
    dS=-beta*S*I/N
    dI=beta*S*I/N-gamma*I
    dR=gamma*I
    k2=np.array([dS,dI,dR])

    S=x[i,0]+k2[0]*h/2
    I=x[i,1]+k2[1]*h/2
    R=x[i,2]+k2[2]*h/2
    dS=-beta*S*I/N
    dI=beta*S*I/N-gamma*I
    dR=gamma*I
    k3=np.array([dS,dI,dR])

    S=x[i,0]+k3[0]*h
    I=x[i,1]+k3[1]*h
    R=x[i,2]+k3[2]*h
    dS=-beta*S*I/N
    dI=beta*S*I/N-gamma*I
    dR=gamma*I
    k4=np.array([dS,dI,dR])

    x[i+1]=x[i]+(k1+2*k2+2*k3+k4)*h/6

다음을 그래프로 나타내면 다음과 같다.

S_t = x[:,0]
Simulated_NI = beta * S_t * I_t / N

plt.figure(figsize=(10,6))
t=time
I_t=x[:,1]
R_t=x[:,2]
lines=plt.plot(t, I_t, 'r' ,t, R_t, 'b')
plt.step(lines[0],lineswidth=3)
plt.step(lines[1],lineswidth=3)
plt.xlabel('time')
plt.ylabel('number of people')
plt.legend(['Infected','Recovered'],fontsize=15)
plt.title('SIR model')
plt.show()

실제 감염자수와의 비교를 해보면 다음과 같다.

data=

  date cases
0 2020-08-01 6
1 2020-08-02 6
2 2020-08-03 15
3 2020-08-04 14
4 2020-08-05 22
5 2020-08-06 19
6 2020-08-07 34
7 2020-08-08 17
8 2020-08-09 17
9 2020-08-10 29
10 2020-08-11 45
11 2020-08-12 55
12 2020-08-13 142
13 2020-08-14 272
14 2020-08-15 178
15 2020-08-16 202
16 2020-08-17 293
17 2020-08-18 301
18 2020-08-19 317
19 2020-08-20 324
20 2020-08-21 341
21 2020-08-22 334
22 2020-08-23 214
23 2020-08-24 332
24 2020-08-25 416
plt.figure(figsize=(10,5))
t1=data.index[0:15]
t2=time
y1=data.loc[0:14,'cases']
y2=Simulation_NI
lines = plt.plot(t1,y1,'*b',t2,y2,'r')
plt.setp(lines[0], markersize=5)
plt.setp(lines[1], linewidth=3)
plt.xlabel('time')
plt.ylabel('Population')
plt.legend(('Observed cases','Simulation cases'),fontsize=10,loc='best')
plt.title('COVID-19')
plt.show()

제 3강

학습목표

  • 이 질병은 시간이 지나면 사라지는가
  • 감염상수는 어떻게 구할 수 있는가
  • 회복 후 재감염 될 수있는 사람 $\delta I$는 어떻게 구할 수 있는가

보도자료를 통한 2회감염 소요기간의 획득 및 상수 사용 (2회감염일-1회감염일) $\delta=\frac{1}{229}$

기초감염재생산지수 $R_0=감염확률접촉빈도전파기간=ap\frac{1}{\gamma}=\frac{\beta}{\gamma}$

이때 $R_0$가 1보다 크면 감염이 지속되고 1보다 작으면 감염이 사라진다.

\[고정점과\;안정점\;(Equilibrium \;point \;and \;Stability) \\.\\ \\.\\ 고정점이\;되려면\; S,I,R 각각의\; 변화량이\; 0이\; 되어야한다. \\ \frac{dS}{dt}=\frac{dI}{dt}=\frac{dR}{dt}=0의\; 연립방정식을\; 풀면\; 다음과\; 같다. \\ (\frac{\beta S}{N}-\gamma)I=0 \hspace{0.25cm} \begin{cases} case1&I=0 \\ case2&S=\frac{\gamma N}{\beta} \end{cases} \\.\\ \\.\\ case1. \\ I=0이라면 S+I+R=N이므로\;N-S-I= 이 됨을 알 수 있다. \\ 따라서\; 첫\;고정점E_1=(N,0,0)이고 \\ 이는\; 감염자가\; 없는\; 상태이다.(disease-free-equilibrium) \\.\\ \\.\\ case2. \\ \frac{\gamma N}{\beta}이라면 S+I+R=N이므로 \\ N-S-I\rightarrow\frac{\gamma}{\delta}I가\;된다. \\ S=\frac{\gamma N}{\beta}이므로 \\ N-\frac{\gamma N}{\beta} = I+\frac{\gamma}{\delta}I \rightarrow N(1-\frac{\gamma}{\beta})=I(1+\frac{\gamma}{\delta})I \\ I=\frac{1-\frac{\gamma}{\beta}}{1+\frac{\gamma}{\beta}}N \\ R=\frac{\gamma}{\beta}. \frac{1-\frac{\gamma}{\beta}}{1+\frac{\gamma}{\beta}}N=\frac{\gamma(1-\frac{\gamma}{\beta})}{\gamma+\delta}N \\ 따라서\; 두번째\;고정점E_2=(\frac{\gamma N}{\beta},\frac{1-\frac{\gamma}{\beta}}{1+\frac{\gamma}{\beta}}N,\frac{\gamma(1-\frac{\gamma}{\beta})}{\gamma+\delta}N) \\.\\ \\.\\ 이는\; 양수I의\; 고정점이\; 존재하고\; 근방의\; 산포가\; 고정점에\; 근접할때\; 질병은\; 사라지지\; 않는다. \\ 그러나,\; E_1 근방의 (S\approx N, I>0) \\I'=(\frac{\beta S}{N}-\gamma)I \approx (\beta-\gamma)I \\ \beta > \gamma 일때 \rightarrow (\beta - \gamma)I > 0 \\ \beta < \gamma 일때 \rightarrow (\beta - \gamma)I < 0 \\ \frac{1-\frac{\gamma}{\beta}}{1+\frac{\gamma}{\delta}}N>0 \rightarrow 1-\frac{\gamma}{\beta}>0 \\ \rightarrow\frac{\gamma}{\beta}<1 \\ \rightarrow\frac{\beta}{\gamma}>1 \\ 따라서\; 고정점이\; 존재하기위해 \beta > \gamma 이어야한다.\]

함수 및 코드 재정의

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#def RK4(f, initial_value,t0,tf,n):
#  time = np.linspace(t0,tf,n+1)
#  x = np.array((n+1)*[initial_value])
#  h = time[1]-time[0]
#  for i in range(n):
#    k1 = h*f(x[i],time[i])
#    k2 = h*f(x[i]+k1/2,time[i]+h/2)
#    k3 = h*f(x[i]+k2/2,time[i]+h/2)
#    k4 = h*f(x[i]+k3,time[i]+h)
#    x[i+1] = x[i] + (k1+2*k2+2*k3+k4)/6
#  return x,time
#
#def f(u):
#  S,I,R = u
#  N = sum(u)
#  dS=-beta*S*I/N+delta*R
#  dI=beta*S*I/N-gamma*I
#  dR=gamma*I-delta*R
#  return np.array([dS,dI,dR])
#
#----->

def fit_F(u,beta):
  S, E, I, R = u
  N=sum(u)
  dS=-beta*S*I/N+delta*R
    #E'(t)=beta*S(t)*I(t)/N-alpha*E(t) 
  dE=beta*S*I/N-alpha*E
    #I'(t)=alpha*E(t)-gamma*I(t)
  dI=alpha*E/N-gamma*I
  dR=gamma*I-delta*R
  return np.array([dS, dE, dI, dR])

def rk4(f, initial_value, t0, tf, n, beta):
  time = np.linspace(t0,tf,n+1) #x_grid
  x = np.array((n+1)*[initial_value]) # array of state of the sys for each x
  h = time[1]-time[0] #step size
  for i in range(n): #4th order Runge-Kutta
    k0=fit_F(x[i],beta)
    k1 = h*f(x[i],beta)
    k2 = h*f(x[i]+k1/2,beta)
    k3 = h*f(x[i]+k2/2,beta)
    x[1+i]=x[i]+h*(k0+2*k1+2*k2+k3)/6
  return x,time

def diff_F(data_y, initial_value, t0, tf, n, x2):
  time, SIR_t = rk4(fit_F, initial_value, t0, tf, n, x2)
  Simulated_NI = alpha*SIR_t[:,1]
  diff=data_y-Simulated_NI[0:n+1:int((1/h)]
  MSE=np.dot(diff,diff)/len(diff)
  return MSE

#defining the parameters
#time step
t0=0 #start time
tf=15 #end time
n=150 #number of time steps
h=(tf-t0)/n #time step size
time=np.linspace(t0,tf,n+1)

#condition parameters S,I,R
N=51840000 #from 2020 korea population

#model parameters
alpha=1/5
beta=0.4  #감염상수-미지
gamma=1/14 #회복률
delta=1/229 # 1/재감염평균일수 

#이때 기초 재생산수 R_0=beta/gamma=0.4/0.0714=5.6이다.
R_0=beta/gamma

#N_time, N_time = RK4(f, np.array([N-1,1,0]),t0,tf,n)
Simulation_NI = alpha* x[: , 1]

#plotting
plt.figure(figsize=(10,6))
t1=data.index[:16]
t2=time
y1=data.loc[15:,'cases']
y2=Simulation_NI
lines=plt.plot(t1,y1,'o',t2,y2,'-')
plt.setp(lines[0],markersize=10)
plt.setp(lines[1],linewidth=2)
plt.xlabel('Time')
plt.ylabel('Number of people')
plt.legend(('obs','sim'),loc='best')
plt.show()

댓글남기기