Data science (101)

반응형

회귀분석의 가정


회귀분석에는 데이터에 대하여 어떠한 가정을 합니다. 그 가정하에서만 회귀분석은 유효하다고 할 수 있습니다. 가정이 틀리면 아무리 분석을 하더라도 그것이 타당하지 않게 되는 것입니다.


회귀분석의 가정에는 아래와 같은 것들이 있습니다.


 

  1. 독립변수 X는 사전에 주어진 값으로 간주한다. 즉 독립변수는 미리 결정된 값이거나 고정된 값이다. 이를 비확률변수라고 한다.

  2. 독립변수 X는 측정오차가 없다고 가정한다.

  3. 독립변수 X 별로 Y의 부분모집단이 존재한다고 가정한다. 예를 들어 X=1일 때 Y의 부분모집단이 존재하며 이 부분모집단은 정규분포를 따른다.

  4. Y의 부분모집단의 분산은 같고 이를 라고 한다. (등분산성)

  5. Y의 부분모집단의 모평균은 일직선상에 있다. 이를 선형성의 가정이라고 한다.

  6. Y는 서로 독립이다. e ~ N(0,) 라고 정리할 수 있다. (독립성)



반응형
반응형

데이터분석 준전문가 시험


국가 공인 데이터 분석 관련 자격증으로 관련 정보는 이곳에서 얻을 수 있습니다.


준비기간 


준비 기간은 4주 정도 천천히 준비했던 것 같습니다. 1주일에 4시간 정도씩 공부해서 책을 쭉 한 번 훑고 시험을 보았습니다. 근데 저 같은 경우는 Data Science에 원래 관심이 있어서 특히 "데이터 분석" 파트는 상식선에서 풀 수 있었습니다. 그래서 잘 아는 부분은 정독을 안하고 빠르게 훑기만 해서 책을 빨리 볼 수 있었던 것 같네요. 원래 데이터 분석 분야에 관심이 있던 분들은 저처럼 빠르게 1회 훑고, 모르는 부분만 집중해서 보시면 무난하게 붙으실 수 있고, 원래 관심이 없던 분들은 한 2달 정도 하루에 2시간 정도씩 책 공부하시면 붙을 수 있을 거라 생각합니다. 



교재





http://www.yes24.com/24/goods/34764883?scode=032&OzSrank=1 이 책을 사용하였습니다.




결과




시험 볼 때 데이터 분석 기획에서 헷갈리는게 많아 과락 맞을까봐 걱정을 했는데 다행히 90점이 나왔네요. 데이터 이해는 무난하게 풀었던 것 같은데 60점... 그래도 과락은 면했습니다 ㅎㅎ



TIP


우선 데이터분석 준전문가 시험은 합격 기준은 총점 60/100이며, 각 파트별로 40/100 미만이면 과락 처리됩니다. 그래서 다른 파트에서 아무리 점수를 잘 받아도 한 군데서 과락이 뜨면 불합격입니다.. 그래서 원래 통계학이나 데이터 과학 분야를 잘 아시는 분들이라도 "데이터 이해" 파트와 "데이터 분석 기획" 파트는 조금 공부가 필요하다고 생각됩니다.  물론 아예 공부를 안하고 시험을 봐서 붙는 분들도 계시긴 하십니다. 하지만 안전하게 하려면 "데이터 이해" 와 "데이터 분석 기획"은 조금 공부를 하고 가시는게 안전빵일 것 같아요~


그리고 데이터 분석 초심자 분들이나 비 전공자 분들은 "데이터 분석" 파트가 조금 어렵게 느껴질 수도 있을 거라 생각을 합니다. 특히 회귀 분석이나 시계열 분석 같은 파트에서 결과 해석 부분은 헷갈리게 느껴지실 수 있으실 것 같은데요. 가장 빠르게 합격하는 방법은 "데이터 이해" "데이터 분석 기획" 파트에서 과락을 맞지 않을 정도로만 공부하고 데이터 분석 파트만 파는게 가장 합격을 높일 수 있는 방법인 것 같아요. 점수 배분이 20:20:60 으로 데이터 분석 파트가 가장 비중이 크기 때문에 다른 건 좀 못봐도 데이터 분석 파트에서 점수를 많이 받는다면 합격선은 무난히 넘길 수 있을 거라 생각됩니다.


반응형
반응형



validation set은 machine learning 또는 통계에서 기본적인 개념 중 하나입니다. 하지만 실무를 할때 귀찮은 부분 중 하나이며 간과되기도 합니다. 그냥 training set으로 training을 하고 test만 하면 되지 왜 귀찮게 validation set을 나누는 것일까요?


validation set을 사용하는 이유는 간단합니다. 바로 "모델의 성능을 평가하기 위해서" 입니다.  training을 한 후에 만들어진 모형이 잘 예측을 하는지 그 성능을 평가하기 위해서 사용합니다. training set의 일부를 모델의 성능을 평가하기 위해서 희생하는 것입니다. 하지만 이 희생을 감수하지 못할만큼 data set의 크기가 작다면 cross-validation이라는 방법을 쓰기도 합니다. cross-validation은 training set을 k-fold 방식을 통해 쪼개서 모든 데이터를 training과 validation 과정에 사용할 수 있게 합니다. 


그러면 모델의 성능을 평가하면 뭐가 좋을까요? 첫 번째는 test accuracy를 가늠해볼 수 있다는 것입니다. machine learning의 목적은 결국 unseen data 즉, test data에 대해 좋은 성능을 내는 것입니다. 그러므로 모델을 만든 후 이 모델이 unseen data에 대해 얼마나 잘 동작할지에 대해서 반드시 확인이 필요합니다. 하지만 training data를 사용해 성능을 평가하면 안되기 때문에 따로 validation set을 만들어 정확도를 측정하는 것입니다. 두 번째는 모델을 튜닝하여 모델의 성능을 높일 수 있습니다. 예를 들어 overfitting 등을 막을 수 있습니다. 예를 들어 training accuracy는 높은데 validation accuracy는 낮다면 데이터가 training set에 overfitting이 일어났을 가능성을 생각해볼 수 있습니다. 그렇다면 overfitting을 막아서 training accuracy를 희생하더라도 validation accuracy와 training accuracy를 비슷하게 맞춰줄 필요가 있습니다. 예를 들어 Deep learing을 모델을 구축한다면 regularization 과정을 한다거나 epoch을 줄이는 등의 방식으로 overfitting을 막을 수 있습니다. 


/* 2018/03/18 추가 */


validation test set과의 차이점은 test set은 모델의 '최종 성능' 을 평가하기 위해서 쓰이며, training의 과정에 관여하지 않는 차이가 있습니다. 반면 validation set은 여러 모델 중에서 최종 모델을 선정하기 위한 성능 평가에 관여한다 보시면됩니다. 따라서 validation set은 training과정에 관여하게 됩니다. 즉, validation set은 training 과정에 관여를 하며, training이 된 여러가지 모델 중 가장 좋은 하나의 모델을 고르기 위한 셋입니다. test set은 모든 training 과정이 완료된 후에 최종적으로 모델의 성능을 평가하기 위한 셋입니다. 만약 test set이 모델을 개선하는데 쓰인다면, 그건 test set이 아니라 validation set입니다. 만약 여러 모델을 성능 평가하여 그 중에서 가장 좋은 모델을 선택하고 싶지 않은 경우에는 validation set을 만들지 않아도 됩니다. 하지만 이 경우에는문제가 생길 것입니다. (test accuracy를 예측할 수도 없고, 모델 튜닝을 통해 overfitting을 방지할 수도 없습니다.)

반응형
반응형

직접 표준화


  • 비교하고자하는 집단의 연령별 측도(발생률, 유병률, 사망률 등)는 알려져있지만, 표준화된 인구에서는 어떨지 알아보고 싶을 때 사용한다.
  • 표준화된 인구 구조가 미리 정해져있어야한다. 
  • 표준화된 인구 구조를 정하는 방법에도 여러가지가 있는데, 한국이면 주로 한국 표준 인구를 사용한다. 또는 세계인구를 사용할 수도 있다.


방법 )


1. A집단과 B집단의 연령별 사망률을 알아보고자 할 때, 두 집단 별로 사망률을 표준 인구에 대입시켜 표준 인구에서의 연령별 기대 빈도수를 계산한다.

2. 연령별 기대 빈도수를 모두 합한 후, 표준 집단의 총 인구수로 나누어 표준화율을 구한다.

3. 두 집단의 표준화율을 비교하여 어떤 집단의 사망률이 더 높은지를 판단한다.



간접 표준화


  • 간접 표준화의 경우, 특히 어떤 집단의 발생률, 사망률 등이 표준 집단에 비해 높은지, 낮은지를 판단하기 위해서 사용한다.
  • 또는 두 집단의 발생률, 사망률 등을 비교할 때도 쓰인다.
  • 간접 표준화 방법실제 관찰된 사건 수기대사건 수비교하는 방법이다.
  • (실제 관찰된 사건 수) / (기대사건수) = SIR (또는 사망률일 경우 SMR) 이라고 한다.
  • SIR = Standardized Incidence Ratio, SMR = Standardized Mortality Ratio 의 약자이다.
  • 만약 어떤 집단의 발생률이 표준 집단에 비해 높은 경우 SIR > 1일 것이고, 낮은 경우 SIR < 1 일 것이다.
  • 이 SIR에 표준화 발생률을 곱하면 간접 표준화 발생률이 된다.
  • 즉, 간접표준화발생률 = SIR * 표준화발생률

직접 표준화 방법에 비해 간접표준화 방법이 가지는 방법의 이점

  • 특정 집단의 전체 율만 아는 경우
  • 연령별 율의 신뢰도가 적은 경우
  • 사망자수나 발생자 수가 워낙 적어 값이 불안정한 경우

위와 같은 경우에 간접 표준화 방법은 직접 표준화 방법에 비해 더욱 안정적이고 보수적인 값을 제공한다.

직접 표준화 방법과 간접 표준화 방법의 차이를 직관적으로 정리하면 직접 표준화 방법에서는 비교하고자하는 집단의 발생률을 표준 집단에 가져가서 표준집단에서 기대 발생자수를 구하고, 간접 표준화 방법에서는 표준 집단의 발생률을 비교하고자하는집단으로가져가 기대 발생자수를 구한다. 

직접 표준화 방법의 경우 비교하고자하는 집단의 발생률을 표준 집단으로 가져가는 것이기 때문에 비교하고자하는 집단의 발생률이 불안정하면 안된다. 예를 들어 비교하고자하는 집단의 사람 수가 너무 적다면, 예를 들어 희귀병이 3명중 1명이 발생하였으면 발생률이 0.33이 되어서 이 값은 불안정한 값이된다. 따라서 표본의 수, 발생자 수가 적다면 간접 표준화 방법을 쓰는것이 더 안정적이다. 


간접 표준화 방법 예시


그냥 보기에는 Area2가 사망률이 높아보인다. (5.1% vs 4.1%) 그러나 잘 보면 Area2가 전체적인 연령이 높은 것을 알 수 있다. 이 경우 간접표준화 방법을 이용하여 연령을 보정해보자.



표준 인구집단을 선정한다. 표준 인구집단은 많은 경우에 '대한민국 표준인구'를 사용하지만 이 경우에는 Area1+Area2를 통해 표준 인구를 구성한다. 이렇게 구한 표준 인구의 사망률은 4.6%이다.



Area1과 Area2의 연령별 기대 사망자수를 구한다. 기댓값은 (사람수)x(표준화사망률)로 구한다. 
Area1의 기대 사망자수는 37.79 명이고, Area2의 기대 사망자수는 54.21명이다.

따라서, 
Area1의 SMR = 41/37.79 = 1.08
Area2의 SMR = 51/54.21 = 0.94 이다. 

절대적으로는 Area2의 사람이 더 많이 죽었지만 표준화된 인구를 고려했을 때, Area2의 상대적으로 많이 죽었음을 알 수 있다.

마지막으로 간접표준화사망률을 구하면

Area1의 간접표준화사망률 = 4.6% * 1.08 = 5.0%
Area2의 간접표준화사망률 = 4.6% * 0.94 = 4.3%



참고

http://www.dartmouthatlas.org/downloads/methods/indirect_adjustment.pdf



반응형
반응형

Relative Risk 와 Odds Ratio의 정의


 

 disease

non-disease 

 

 smoker 

20 (a)

80 (b)

100 

 non-smoker 

5 (c)

95 (d)

100 

 

25 

175 

200 


 

Relative Risk는 Risk Ratio 라고도 부르며 줄여서 RR 이라고 부르기도 합니다. 이름에서 알 수 있듯 RR은 Risk의 '비' 를 뜻합니다. 예를 들어, 위 표에서 smoker의 disease에 대한 Risk는 20/100 = 0.2 입니다. 즉 smoker인 경우 질병에 걸릴 확률이 0.2라는 것입니다. 반면 non-smoker의 disease에 대한 Risk는 5/100 = 0.05 입니다. 따라서 smoking의 disease에 대한 Relative Risk는 0.2/0.05 = 4 라고 할 수 있습니다. 이를 식으로 표현하면 (a/a+b)/(c/c+d) 입니다. Relative Risk는 직관적입니다. 담배를 폈을 경우 4배 더 질병에 걸릴 확률이 높다. 라고 직관적으로 해석할 수 있습니다. 


odds ratio는 OR 이라고 부르며 odds의 '비율' 입니다. 따라서 odds ratio를 알기 전에 우선 odds가 무엇인지 알아야합니다. odds는 실패와 성공의 비입니다. 위의 경우에는 smoker의 질병에 대한 odds는  20/80 = 0.25 이고 non-smoker의 질병에 대한 odds는 5/95 = 0.052 입니다. 따라서 odds ratio는 0.25/0.052 는 약 4.8입니다. 이를 수식으로 표현하면 (a/b)/(c/d) = 4.8 입니다. 값을 구하는건 구하는 건데 odds ratio는 직관적으로 해석하기 어렵습니다.



왜 Odds Ratio를 쓸까?


위와 같은 상황 (어떠한 처리군들 간에 질병에 대한 비교를 할 경우) RR을 써도 OR을 써도 상관없습니다. 하지만 중요한 것은 case-control study에서는 relative risk를 쓸 수 없습니다. 즉, case-control study에서는 OR만 씁니다.



Case Control Study란 무엇인가?


Case Control Study는 사례대조연구라고 하는데 우선 네이버 백과에서 정의를 살펴보겠습니다.


연구대상군의 특성을 명확히 하고 그 기본적 구조를 명백히 하기 위해 몇가지 요인을 조절한 대상 control을 골라 제각기 거기에 대해서 동일내용 및 방법으로 조사ㆍ연구를 하는 일종의 비교연구 법이다. [네이버 백과]


말이 어렵게 되어있는데 예를 들어 다음과 같은 상황입니다. 위에서는 smoker 100명, non-smoker 100명을 뽑아서 이들간에 질병의 발생률을 비교했죠. 하지만 아래와 같은 경우에는 병에 걸린사람 100명, 병에 걸리지 않은 사람 100명을 뽑았습니다.  (위에서 병에 걸린 사람의 smoker와 non-smoker의 비가 4:1으므로 여기서도 4:1 정도일 것입니다.) 이렇게 환자군과 대조군을 뽑아서 비교하는 것을 case-control study라고 합니다. 질병의 발생률이 매우 낮은 경우에는 이러한 study가 위와 같은 코호트 연구보다 좋습니다. 


 

 disease

non-disease 

 

 smoker 

80 (a)

45 (b)

 125

 non-smoker 

20 (c)

55 (d)

 75

 

100

100

200


이 경우 smoker의 risk를 구해보면 80/125입니다. 그대로 해석하면 약 65%의 환자가 흡연자가 병에 걸린다는 것입니다. 이는 모순입니다. 왜냐하면 병에 걸린 사람 100명, 병에 걸리지 않은 사람을 100명을 대상으로 RR을 계산한 것이니 병에 걸릴 위험율이 높게 나올 수 밖에 없겠죠. 실제로 RR을 구하면 (80/125) / (20/75) = 2.4 입니다. 샘플이 바뀌면, RR도 바뀐다는 것을 알 수 있습니다. 따라서 이러한 경우에는 RR을 쓸 수 없습니다. 하지만 case-control study에서 OR은 유효합니다. (80/45)/(20/55) = 약 4.91이 나옵니다. 따라서 OR이 RR 보다 더욱 범용적이라고 할 수 있습니다. 


또한 OR은 RR의 근사치로 사용되기도 합니다. OR = (a/b)/(c/d)이고 RR = (a/(a+b))/(c/(c+d)) 입니다. 따라서 a, c가 매우 작은 값이라면 OR을 RR에 근사시킬 수 있습니다. 그러므로 이러한 근사를 사용하면 위와 같은 case-control study에서도 OR을 근사해 RR을 알아볼 수 있는 것입니다.



반응형
반응형

/**

날짜 : 2017.01.30

밑바닥부터 시작하는 딥러닝(한빛미디어) 참고

Softmax 구현 및 성질

*/


Softmax 함수는 3-class 이상의 classification을 목적으로 하는 딥러닝 모델의 출력층에서 일반적으로 쓰이는 활성화 함수(activation function)이다. Softmax 함수는 아래와 같이 나타낼 수 있다.




이를 Latex 표기법으로 나타내면 아래와 같다. (Latex는 라텍스라고 읽으면 안되고 레이택으로 읽는다..)


\begin{align}

y_k = {exp(a_k)}/{\sum_{i=1}^{n}(exp(a_i))}

\end{align}


(위 코드를 Jupyter notebook에서 markdown으로 선택하여 입력 후 run을 누르면 위와 같은 수식이 출력되는 것을 확인할 수 있다. Jupyter notebook에서는 Latex 코드를 수식으로 변환하는 기능을 지원한다.)


""" Softmax 구현 """
import numpy as np

def softmax(a) :
    exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    
    return y

a = np.array([0.3, 2.9, 4.0])

print softmax(a) # softmax 결과값 출력
print sum(softmax(a)) # softmax 결과값들의 합은 1이 된다.


Softmax 수식을 그대로 파이썬 코드로 옮기면 위와 같다. 결과가 잘 출력되는 것을 확인할 수 있다. 하지만 Softmax는 수식 안에 e의 지수를 포함하고 있는데, 지수함수는 지수가 커질 수록 매우 큰 폭으로 증가하기 때문에 overflow가 발생하기 쉽다. 아래 코드를 보면 overflow가 발생하는 예와 이를 어떻게 해결하는지를 볼 수 있다.


""" Softmax는 Overflow에 취약하다.
    수식에 e^x 들어가기 때문에 Overflow 범위를 넘어설 수 있다. 
    이를 해결하기 위해서는 Softmax의 성질을 이용한다.
"""
def new_softmax(a) : 
    c = np.max(a) # 최댓값
    exp_a = np.exp(a-c) # 각각의 원소에 최댓값을 뺀 값에 exp를 취한다. (이를 통해 overflow 방지)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y
    
a = np.array([1010, 1000, 990]) 
print softmax(a) # overflow
print new_softmax(a) # 정상적으로 출력

# 또한 softmax와 new_softmax 의 결과값을 같다.
test = np.array([1,3,6])
print 'softmax', softmax(test) # [ 0.00637746  0.04712342  0.94649912]
print 'new_softmax', new_softmax(test) # [ 0.00637746  0.04712342  0.94649912]


Softmax를 구현할 때 overflow 가 자주 발생하는 문제를 해결하기 위해 위와 같은 새로운 softmax 함수인 new_softmax를 정의한다. 이는 원소에 어떠한 수를 더하여 exp를 취하더라도 결과 값이 같다는 softmax의 성질을 이용한 것인데, 


위의 등식에서 C를 '원소들의 최댓값의 음수'로 한 것이다. 예를 들어 a = [1010,1000,990] a+c = [0,-10,-20] 이 된다. 이 때, a와 a+c의 softmax 결과값은 같다.



반응형
반응형

/**

날짜 : 2017.01.25

밑바닥부터 시작하는 딥러닝(한빛미디어) 참고

Numpy 기초, 간단한 신경망 구현

*/



numpy 패키지는 데이터 과학, 딥러닝 분야에서 쓰이는 매우 중요한 파이썬 패키지이다. numpy는 거의 표준이라고 불릴만큼 대부분의 사람들이 애용하는 패키지이다. numpy가 쓰이는 가장 큰 목적 중에 하나는 배열, 행렬, 벡터, 텐서와 같은 '다차원 배열'의 구현이다. 많은 사람들이 다차원 배열을 구현할 때 numpy를 이용한다. numpy에서는 이를 ndarray라고 부른다. 또 파이썬의 기본 자료 구조에는 array가 없기 때문에, 꼭 딥러닝이 아니더라도 numpy array는 파이썬에서 1차원 배열을 구현할 때도 쓰인다.


numpy의 기초 문법을 정리하고 이를 이용하여 인풋 2개, 아웃풋 2개, 히든 레이어가 2개(각각 노드수가 3, 2인)인 간단한 신경망을 구현해 보았다.


import numpy as np

A = np.array([1,2,3,4])

print(A)

# 차원출력
np.ndim(A)

# 배열 형상 출력. 튜플로 반환된다.

print A.shape
# (4L,)

print A.shape[0]
# 4


  • 위와 같은 문법을 통해 numpy array를 만들 수 있고, shape, dimension 등을 확인할 수 있다.


""" 2차원 배열 """
B = np.array([[1,2], [3,4], [5,6]])
print(B)

np.ndim(B)

B.shape


  • 2중 대괄호를 쓰면 2차원 배열을 만들 수 있다.


""" 3차원 배열 이상 """
# 2x3x4 배열을 만들고 0으로 초기화
C = np.zeros((2, 3, 4))

print 'C', C

# 아래와 같이 자유롭게 만들 수 있음
D = np.array([[[ 1., 2., 3., 4.],
        [ 0.,  0.,  2.,  0.],
        [ 4.,  0.,  3.,  0.]],
       [[ 1.,  4.,  0.,  6.],
        [ 0.,  0.,  5.,  0.],
        [ 0.,  0.,  0.,  5.]]])

print 'D', D

# 2x2x3x4 4차원 배열
E = np.zeros((2,2,3,4))
print 'E', E


  • 위와 같이 3차원 배열, 4차원 배열 등의 고차원 배열을 만들 수 있다.


""" 내적 """
A = np.array([[1,2], [3,4]])
A.shape

B = np.array([[5,6], [7,8]])
B.shape

np.dot(A,B)

#array([[19, 22],
#       [43, 50]])


  • np.dot 명령어를 통해 두 행렬의 내적(dot product)을 구할 수 있다. 신경망에서 이전층에서 다음층으로 forward 되는 것을 구현할 때 입력과 출력을 행렬의 내적으로 표현할 수 있다.


""" 간단한 신경망 구현 
    입력층에서 1층으로 가는 신호 
    첫 번째 히든 레이어의 노드 수는 3개
"""

def sigmoid(num) : 
    return 1/(1+np.exp(-num))

X = np.array([1.0,0.5]) # 입력이 2개 (x1, x2)
W1 = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]]) # 입력에 대응하는 weights 
B1 = np.array([0.1,0.2,0.3]) # bias

print X.shape # 1x2
print W1.shape # 2x3
print B1.shape # 1x3

A1 = np.dot(X,W1) + B1
Z1 = sigmoid(A1) # 첫 번째 레이어의 최종 아웃풋

print A1
print Z1


입력층에서 첫 번째 히든 레이어(노드 3개짜리)로 forward하는 것을 구현한 것이다. 입력과 weights, bias는 임의로 정한 것이다. 입력은 x1, x2 이고 각각 1.0,  0.5 이다. weights는 총 6개이다. (이는 input layer의 노드 수 2와 첫 번째 히든레이어의 노드수 3을 곱한 것이다.) bias는 길이 3의 array인데 이를 더해주어 XW에 더하여 XW+B를 만든다. Bias가 왜 필요한지 그리고 신경망에 대한 기본적인 이해는 http://hunkim.github.io/ml/ 홍콩 과기대 김성훈 교수님의 강의를 참조하면 좋다.


""" 1층에서 2층으로 가는 신호 구현
"""
W2 = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
B2 = np.array([0.1,0.2])

print Z1.shape # 1x3 첫 번째 레이어의 아웃풋이 인풋이 된다.
print W2.shape # 3x2
print B2.shape # 1x2

A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)


 첫 번째 히든레이어에서 두 번째 히든레이어로 forward하는 것의 구현이다. 첫번째 히든 레이어의 아웃풋 Z1이 인풋이 되었고 위와 같은 방식으로 Z1*W2+B2를 하면 두 번째 히든 레이어의 output을 구할 수 있다.


""" 2층에서 출력층으로 가는 신호 구현
"""

# 출력층의 활성화 함수로 항등함수를 쓴다. 
# 회귀의 경우 출력층의 활성화 함수로 일반적으로 항등항수를  쓴다.
# 2-class classification에서는 sigmoid
# 3-class 이상의 classification에서는 softmax를 쓴다.
def identity_function(x) :
    return x

W3 = np.array([[0.1,0.3],[0.2,0.4]])
B3 = np.array([0.1,0.2])

print Z2.shape # 1x2
print W3.shape # 2x2
print B3.shape # 1x2

A3 = np.dot(Z2, W3) + B3
Y = identity_function(A3)

print Y # 최종 아웃풋 출력 


두 번째 히든 레이어에서 출력층으로 forward 하는 것의 구현이다. 출력층의 activation function은 identity function을 사용하였는데, 이는 '풀고자 하는 문제의 성질' 과 관련이 있다. 회귀에서는 항등함수를, 2클래스 분류에서는 시그모이드를, 다중 클래스 분류에는 소프트 맥스 함수를 사용하는 것이 일반적이다.

반응형
반응형

/**

날짜 : 2017.01.25

밑바닥부터 시작하는 딥러닝(한빛미디어) 참고

activation function 정리

*/


1. Step Function


import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
""" 일반적인 step_function """
def step_function(x) : 
    if x > 0 :
        return 1
    else : 
        return 0

""" numpy의 트릭을 사용한 step function 구현 """
def step_function_np(x) : 
    y = x > 0
    # boolean을 int로 변환하면 True = 1, False = 0이 된다.
    # numpy 배열의 type을 변경할 때 .astype을 쓴다.
    return y.astype(np.int)


첫 번째 step_function의 경우 numpy array를 입력으로 받아들일 수 없다. 반면 step_function_np 함수는 numpy array를 입력으로 받아들일 수 있다. 아래의 경우 y = x > 0 에서 boolean 형식의 numpy array가 반환되는 점을 트릭으로 활용하여 이를 step_function 구현해 활용한 것이다.


실제로 파이썬에서 deep learning 알고리즘을 구현할 때는 일반적으로 numpy array를 입력으로 받아 numpy array를 출력으로 내보내는 함수를 작성하는 것이 편하므로 step_function_np와 같이 구현하는 것이 더 바람직하다.


x = np.arange(-5.0, 5.0, 0.1) # -5.0부터 5.0까지 0.1 간격의 numpy array 생성
y = step_function_np(x)

plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()



2. Sigmoid function


def sigmoid(x) :
    return 1 / (1+np.exp(-x))

x = np.array([-1.0, 1.0, 2.0])

# numpy broadcast 기능으로 인해 정상수행
sigmoid(x)


  • numpy broadcast 기능으로 인해 numpy array에 어떠한 연산을 하면 각각의 element에 연산이 적용된 numpy array가 반환된다.


x = np.arange(-5.0,5.0,0.1)
plt.plot(x, sigmoid(x))
plt.ylim(-0.1,1.1)
plt.show()


  • np.arange는 -5.0 부터 5.0까지 0.1 간격으로 numpy array를 생성해준다.



3. ReLU


def relu(x) : 
    return np.maximum(0, x)


x = np.arange(-5.0,5.0,0.1)
plt.plot(x, relu(x))
plt.show()





반응형
반응형

/**

NbViewer를 통해 Jupyter Notebook Share하기

작성자 : 3개월

2016/11/7

*/


Jupyter notebook으로 작성한 코드를 누군가와 공유하고 싶을 때

Nbviewer를 사용하면 간편하게 웹을 통해 코드와 코드의 실행 결과를 공유할 수 있다.

방법은 github gist에 ipynb를 업로드한 후 gist 코드를 Nbviewer 웹 페이지에 입력만 하면 된다.



이 절차는 아래와 같다. (iPython의 notebook 파일인 ipynb를 기준으로 설명한다.)


1. https://gist.github.com/ 에 접속한다.


2. 공유하고 싶은 .ipynb 파일의 raw source를 복사해서 붙여넣는다.

그리고 create public gist를 클릭한다.



3. 만들어진 파일을 클릭해서 들어가면 아래와 같은 url을 볼 수 있다. 뒤의 코드를 복사한다. 9ca2c306ccfa ... 부분이다.




4. http://nbviewer.jupyter.org/ 에 접속해 아래 빈칸에 코드를 붙여넣고 Go! 를 누른다.





위와 같이 Jupyter notebook 코드가 업로드되어 있는 것을 확인할 수 있다. 

누군가와 코드를 공유할 때 위의 nbviewer 링크만 보내주면 간단히 코드와 그 결과를 공유할 수 있다.



반응형
반응형

Jupyter notebook에서 tensorflow를 이용하려고 하였는데 tensorflow 모듈이 없다는 반응이 오는 문제가 있었습니다.

이 문제 해결을 위하여 오랜 시간을 사용 하였기에 다른 분들은 빨리 해결하면 좋겠다는 마음에서 이 글을 썼습니다.



문제 : https://github.com/jupyter/jupyter/issues/95


iPython 쉘 환경에서와 Jupyter notebook에서 virtualenv를 사용할 때 반응이 다름.



해결 : http://ipython.readthedocs.io/en/latest/install/kernel_install.html


Jupyter notebook에서 virtualenv를 이용하려면 수동으로 지정을 해주어야합니다.


source activate myenv python -m ipykernel install --user --name myenv --display-name "Python (myenv)"



위처럼 source activate를 통해 가상환경을 만들고 이 상태에서 ipykernel 위에도 가상환경을 인스톨하면 

Jupyter notebook에서도 가상환경을 이용할 수 있습니다.




반응형
반응형