2016년 4월 22일 금요일

Bayes theorem

확률의 덧셈 법칙:
P(A|B) = P(A) + P(B) - P(AB)

P(A|B) -> P(B) given일 때, P(A) 즉, B확율이 주어졌을 때, A가 발생할 확률

어떤 두 사건이 동시에 일어 날 수 없을 때, 배반인 사건이라고 한다. (mutually exclusive event)
A와 B가 서로 배반일 때
P(A|B) = P(A) + P(B)

조건부 확률의 계산 
P(B|A) = P(AB) / P(A) (단 P(A) > 0)

곱셈 법칙 : 
P(AB) = P(B|A)P(A)
독립사상의 곱셈 법칙 :
P(AB) = P(A)P(B)

여사상의 확률 : 
P(A) + P(Ac) = 1 즉, P(Ac) = 1-P(A)  

확률의 분할 법칙 : 
P(B) = P(AB) +P(AcB)
      = P(B|A)P(A) + P(B|Ac)P(Ac)

평소 하는 말 중 70%가 거짓말인 사람에게 거짓말 탐지기로, 어떤 물음에 대한 대답이 거짓인지 참인지를 조사하려 한다.이 거짓말 탐지기는 90%의 정확성을 가지고 있다고 할 때 대답이 거짓이라는 조사 결과가 나올 확률을 얼마인가?

A : 그 사람이 거짓 말을 함
B : 거짓말 탐지가가 '거짓'이라고 답 함

P(A) = 0.7   P(Ac) = 0.3   P(B|A) = 0.9    P(B|Ac) = 0.1
따라서,
P(B) = P(B|A)P(A) + P(B|Ac)P(Ac)
      = 0.9 * 0.7 + 0.1 * 0.3
      = 0.66

Bayes 정리

위에서 거짓말 탐지기의 조사 결과가 '거짓'으로 나왔을 때 우리는 그 조사 결과를 어느 정도 믿을 수 있을까? 이것은 조사 결과가 '거짓'으로 나왔을 때 그 사람이 실제로 거짓말을 했을 조건부확률을 구하면 된다.
P(AB) = P(B|A)P(B) = 0.9 * 0.7 = 0.63

P(A|B) = P(AB) / P(B) = 0.63 / 0.66 = 0.955

이렇게 어떤 실험결과에서 나온 정보를 이용하여 어떤 사건의 처음 확률을 개선시킬 수 있는데, 이 때 처음의 확률을 사전확률(prior probability)라 하고, 수정된 확률을 사후확율(posterior probability)라 한다.

위의 예에서 사후확률을 구한 방법을 정리하면 다음과 같다.
P(A|B) = P(AB) / P(B)
         = P(B|A)P(A) / (P(B|A)P(A) + P(B|Ac)P(Ac))

베이즈 정리 : 
서로 배단인 사건 A1, A2, A3... An중 하나는 반드시 일어날 때, P(B) >0 이면,
P(Ak|B) = P(B|Ak)P(Ak) / ((P(B|A1)P(A1) + (P(B|A2)P(A2) + ... + (P(B|An)P(An))

베이즈 정리를 사용하면 여러 가지 사후확률을 구할 수 있다.






scipy - factorial

pytyon math 에서도 factorial이 가능하다.
math.factorial(x)

array나 계산량이 많아진다면, scipy misc에서 제공하는 factorial을 이용하면 된다.

from scipy.misc import factorial
arr = np.array([3,4,5])
factorial(arr, exact=False)

A Gaussian process in a nutshell

A Gaussian process in a nutshell

likehihood P (t | X, θ, φ) = N [m(X, φ), K]  multivariate Gaussian

t : output vector (e.g. fluxes)
X : input matrix (e.g. time, pointing, detector temperature...)
θ, φ : (hyper-)parameters

m : mean function
φ : mean function parameters that one of (hyper-)parameters above
K : covariance matrix -> Knm ≡ cov [xn, xm] = k(xn, xm, θ)
k : kernal function -> k(xn, xm, θ)
θ : kernal parameters that one of (hyper-)parameters above

두 확률변수의 공분산(covariance) : E -> Expectation(기대값)
cov(X, Y) = E[(X-ux)(Y-uy)]
            = ΣxΣy(x-ux)(y-uy)P[X=x, Y=y]
단, P[X=x, Y=y]는 X와 Y의 결합확률분포에서 X=x 그리고 Y=y일 확률을 나타낸다.

공분산의 간편식 :
cov(X, Y) = E(XY) - uxuy
            = ΣxΣy xyP[X=x, Y=y] - uxuy

두 확률변수의 상관계수(correlation coefficient) :  SD --> Standard Deviation (표준편차)
Corr(X, Y) = Cov(X, Y) / SD(X)SD(Y)  


reference : http://www.robots.ox.ac.uk/~mosb/public/pdf/165/algrain_suzanne.pdf

2016년 4월 12일 화요일

영어 말하기 - 간단한 형태

영어 말하기를 위해서, "영어 말하기" 개념을 머리속에 정립할 필요가 있다.
머리가 이해하지 못하면, 그렇을 이용해서 "생각"을 "말 덩어리"로 변환하기는 99.99% 불가능한 일이될 것이다.

한 마디로 정리하면, 영어는 다음의 형태이다!!!

뭐가 어떻다.

음... 무슨 소리인가. 흔히 알고 있던, 5형식도 아니고, 주어 + 동사 + 목적어도 아니고... 뭐가 어떻다니... 도대체 뭐가 어떻다는 것일까?

흔히 우리가 격은 상황을 머리속에 떠올려 보자.

직장 상사가 흔히 하는 말. "언제 끝나?"
첫째 딸이 흔히 하는 말. "사과 먹고 싶어."

우선, 이 두 번째부터 시작해 보자. 썩 좋은 예문은 아니지만, 우선 시작은 두 번째 한 마디면 충분하다.

어떻게 영어를 뱉아야 할까?
대부분 머리속에 떠오른 것은,

Apple eats.

흠... 뭐가 잘못된 것일까?먼저 앞에서 정의한 것과 같이 "뭐가 어떻다"라는 틀에 맞혀보자.
"사과(가) 먹었다" 인가? "내(가) 사과(를) 먹었다." 인가?
"사과 먹고 싶어."라고 한국말을 했다면, 정확히 "내(가) 사과(를) 먹고 싶어."라는 말을 하고 싶었을 것이다. 하지만, 언어는 엄청나게 경제적인 것을 추구하고 있기 때문에, 반복이 발생하면, 반복을 생략했을 때, 뜻(생각)이 전달되면 생략하게 된다. 물론 생략의 과정은 사회적 합의가 필요한 것이며, 암묵적으로 합의된 것들이 언어 생활에 나오게 된다. 이 생략의 과정은 한국말의 특징만은 아니고, 영어도 같은 특징을 가지고 있다.

6살된 "지후"의 언어 습관을 관찰해 보면, 다음과 같이 말한다.
"지후, 사과 먹고 싶어."
9살된 "지원"이의 언어 습관을 관찰하면 다음과 같다.
"사과 먹고 싶어."

즉, 지후는 "뭐가 어떻다"라는 틀에 맞게 언어 생활을 하지만, 지원이는 굳이 반복적으로 본인이 뭔가를 하고 싶다는 것을 말할 때는 말하는 주체인 본인을 굳이 말하지 않아도 뜻이 전달되는 것을 알고 있는 것이다.

영어를 정확히 구사하기 위해서는 내가하는 한국말을 정확히 이해해야 하고, 머리에 그림(이미지)을 그릴 수 있어야 한다.
내(가) 사과(를) 먹는 것인지, 사과(가) 나(를) 먹는 것인지.

영어 말하기 - 말이란

영어는 "말 덩어리"들이다.
한국어는 나의 "생각 덩어리"를 "말 덩어리"로 표현한 것이다.
한국인인 나에게 영어는 결코 쉽지 않았다.

내가 한국말을 하는 것은 내 생각을 한국말 덩어리로 다른 사람에게 전달해 주는 것이다.
그런데, 영어라는 것을 처음 접하게 되면, 내가 뱉는 (한국)말을 영어로 바꾸는 과정을 거치게 된다.
반대로 영어 말은 듣게 되면, 영어를 한국말로 바꿔서 머리 속에서 다시 정리하는 과정(머리에 그림을 그리는 과정)을 거치게 된다.
즉, 생각과 영어 사이에 한국말이 있기 때문에 영어가 잘 안되는 것이다. 이것은 불행이자 다행이다. 이 글을 읽은 대부분의 사람들은 영어가 익숙하지 않을 것이다. 그렇다고, 생각과 영어 사이에 있는 한국말을 없앨 순 없다. 또한 없애서도 안된다.
아마도, 저 한국말을 없애기 위해서 그토록 학원과 영어 교재에 돈을 투자했는지도 모를 일이다.

가능하다면, 아래 그림과 같이 영어의 위치를 생각쪽으로 당겨준다면, 어떨까?
이렇게 하기 위해선, 한국말로 된 아주 간단한 영어 말하기 틀(Frame)을 만들면 된다.
앞으로 이 간단한 틀이 어떻게 생겨 먹었는지 설명해 보도록 하겠다.

Neural Network - Python

신경망(neural network)에서 backpropagation을 이용해서 학습 하는것은 input을 이용해서 output을 예측하려는 것이다.

InputsOutput
0010
1111
1011
0110

3개열의 input을 이용해서 output을 예측하는 것을 이용해 보자.

2 Layer Neural Network:

import numpy as np

def sigmo(x, deriv=False):
    if(deriv == True):
        return x*(1-x)
    return 1/(1+np.exp(-x))


X = np.array([[0,0,1],
             [1,1,1],
             [1,0,1],
             [0,1,1]])


y = np.array([[0,1,1,0]]).T

np.random.seed(1)
syn0 = np.random.random_sample((3,1))
for itr in xrange(10000): l0 = X l1 = sigmo(np.dot(l0, syn0)) l1_error = y - l1 l1_delta = l1_error * sigmo(l1,True) syn0 += np.dot(l0.T,l1_delta) print "Output after training :"
print l1


Output after training :
[[ 0.00966449]
 [ 0.99211957]
 [ 0.99358898]
 [ 0.00786506]]


VariableDefinition
Xinput dataset 행렬
yOutput dataset 행렬
l0첫번째 Layer, input data에 해당
l1두번째 Layer, hidden layer라고 부르는 것
syn0시냅스0, weights값의 첫번째 Layer, l0과 l1을 연결시켜 줌
*두 벡터 사이즈가 동일하다면, 벡터의 원소들 간에서 1대1 연산을 하여 결과값도 동일한 벡터 사이즈를 갖는 곱셈 연산
-두 벡터 사이즈가 동일하다면, 벡터의 원소들 간에서 1대1 연산을 하여 결과값도 동일한 벡터 사이즈를 갖는 뺄셈 연산
x.dot(y)x와 y가 벡터라면, 벡터의 곱연산. 만약 둘다 행렬이라면, 행렬의 곱. 만약 하나만 행렬이라면, 벡터와 행렬의 곱

위의 결과 "Output after training"을 보면, 뭔가 작동하여 결과가 나왔다. 아래의 설명을 보기 전에 직관적으로 코드가 어떻게 구성되어 있는지, 사이사이의 값들은 어떻게 변하는지 직접 실행해 보길 바란다.

예를 들어,
print y 
print syn0
print l1
print l1_error 

등의 값을 확인해 보기 바란다. xrange(1), xrange(10) 등의 값으로 반복 횟수를 줄여서도 확인해 보기 바란다.

code 설명 : 
def sigmo(x, deriv=False):  
--> sigmoid 함수를 정의한다. Sigmoid 함수는 0과 1사이의 값이다. 이 값은 확률값을 구하는데 사용된다. (누적확률분포(여기서는 Sigmoid 함수)와 uniform 분표(여기서는 y 값(0~1사이)을 이용하면 확률 분포를 컴퓨터를 이용하여 구현할 수 있다. )

if(deriv == True):
    return x*(1-x)
--> sigmoid 를 미분하면 나오는 값 (deviv == True 일때)
return 1/(1+np.exp(-x))
--> sigmoid 함수 값

X = np.array([[0,0,1],  
                 [1,1,1],     
                 [1,0,1],
                 [0,1,1]]) 
--> 3개의 input nodes가 있는, 4개의 training 샘플을 초기화, 행렬의 형태로 보면, 4 X 3 행렬
y = np.array([[0,1,1,0]]).T  
--> output. numpy의 transpose(행렬 변환)를 이용하여, 1 X 4 행렬(벡터)를 4 X 1 행렬(벡터)로 변환 시킴.
input과 output을 연결시켜줄 스냅시스는 3 X 4 행렬이어야 하는 것을 알 수 있다.

np.random.seed(1)
--> Rnadom number 생성을 위한 seed를 1로 고정 시킴. seed값을 변경하지 않으면, 항상 동일한 Random number가 성생됨. (컴퓨터의 Random number는 일정한 수식에 의해서 생성된다. 이 수식에 입력되는 초기 값을 seed라고 한다. 즉 seed 값이 같으면, 동일한 Random number가 생성되는 것이다.)

syn0 = np.random.random_sample((3,1))
--> random 함수는 [0.0, 1.0)의 범위에서 생성되는 uniform 분포이다. 그 값을 3 X 1 형태의 array 에 넣어 준다. 이것은 weight matrix이다. 우리의 간단한 예제는 3개의 input과 1개의 output이 있다. 또한 4X3(input)행렬과 4X1(output)행렬의 연결시켜 주기 위해서는 3X1(syn0)이 필요한 것이다. 우리는 이것을 시냅스0라고 부를 것이다.
이 간단한 예제에서 neural network은 syn0이다. l0(layer0), l1(layer1)은 input과 output값이고, syn0만 hidden layer로써, 모든 learning이 저장된다. (참고, backpropagation)

 l1 = sigmo(np.dot(l0, syn0)) 
--> for 반복문 안에서, 먼저 l0와 syn0 를 행렬 dot 연산을 한다. 위에서 살펴본 것처럼, l0 = X이므로, np.dot(l0, syn0)의 결과는  (4X3) X (3X1) 형태의 형렬 연상이다. 결과는 4X1 형태의 행렬이 된다. 즉 4X1형태의 연산 결과가 sigmo 함수로 전달되고, 그 결과가 l1에 저장된다. sigmo함수 선언에서 deriv==False로 줘놨기 때문에 기본적으로 False값이 전달된다.

l1_error = y - l1
--> y(4X1)와 l1(4X1)을 동일한 형식을 갖고 있으므로, 행렬의 뺄셈을 할 수 있다. 그 차이값(y와 l1의 차이)을 l1_error로 저장하였고, 그 값다 4X1 행렬 형태이다. learning(예측)결과와 output(실제) 값을 비교하여 error값을 계산한다.

l1_delta = l1_error * sigmo(l1,True)
syn0 += np.dot(l0.T,l1_delta)

--> 아래 결과를 보면, for 반복문이 진행되면서, l1, l1_error, sigmo(l1, True), l1_delta 값이 어떻게 변해 가는지 확인할 수 있다.

0 -l1 : 예측값 (for문의 0번째 iteration)
[[ 0.50002859]
 [ 0.75721315]
 [ 0.60279781]
 [ 0.67270365]]
l1_error : (y - l1)의 결과, 실제값과 예측값의 차이
[[-0.50002859]
 [ 0.24278685]
 [ 0.39720219]
 [-0.67270365]]
sigmo(l1,True) :  위의 l1에서의 sigmoid 함수의 기울기
[[ 0.25      ]
 [ 0.1838414 ]
 [ 0.23943261]
 [ 0.22017345]]
l1_delta : l1_error에  sigmo(l1,True) 를 곱한 값
[[-0.12500715]
 [ 0.04463427]
 [ 0.09510316]
 [-0.14811148]]
syn0 :
[[ 0.55675944]
 [ 0.61684728]
 [-0.13326682]]
1 -l1 : (for문의 1번째 iteration)
[[ 0.46673252]
 [ 0.73891558]
 [ 0.6043187 ]
 [ 0.61859299]]
l1_error
[[-0.46673252]
 [ 0.26108442]
 [ 0.3956813 ]
 [-0.61859299]]
sigmo(l1,True) :
[[ 0.24889327]
 [ 0.19291934]
 [ 0.23911761]
 [ 0.2359357 ]]
l1_delta
[[-0.11616658]
 [ 0.05036823]
 [ 0.09461437]
 [-0.14594817]]
syn0
[[ 0.70174204]
 [ 0.52126735]
 [-0.25039898]]
2 -l1
[[ 0.4377253 ]
 [ 0.7256395 ]
 [ 0.61095851]
 [ 0.56730608]]
l1_error
[[-0.4377253 ]
 [ 0.2743605 ]
 [ 0.38904149]
 [-0.56730608]]
sigmo(l1,True) :
[[ 0.24612186]
 [ 0.19908682]
 [ 0.23768821]
 [ 0.24546989]]
l1_delta
[[-0.10773377]
 [ 0.05462156]
 [ 0.09247057]
 [-0.13925656]]
syn0
[[ 0.84883417]
 [ 0.43663234]
 [-0.35029717]]
3 -l1
[[ 0.41331036]
 [ 0.71812285]
 [ 0.62211546]
 [ 0.5215704 ]]
l1_error
[[-0.41331036]
 [ 0.28187715]
 [ 0.37788454]
 [-0.5215704 ]]
sigmo(l1,True) :
[[ 0.24248491]
 [ 0.20242242]
 [ 0.23508781]
 [ 0.24953472]]
l1_delta
[[-0.10022152]
 [ 0.05705825]
 [ 0.08883605]
 [-0.13014992]]
syn0
[[ 0.99472848]
 [ 0.36354068]
 [-0.43477431]]


작성중,
참고 : https://iamtrask.github.io/2015/07/12/basic-python-network/



















2016년 4월 11일 월요일

Python - Sigmoid 함수 그리기

Python 2.7 기준

Sigmoid function 을 python으로 그리기.

# python 2.7 기준 code입니다.
# ML 관련 글을 보면 Sidmoid 함수 관련 많은 글들이 있습니다. 
# 해당 함수 그래프를 보면 직관적으로 알수 있어서 표현해 봤습니다.
import numpy as np
import matplotlib.pyplot as plt

def sigmo(x):   # 
    a = []   # 빈 array를 만들어 줍니다.
    for itr in x:   # parameter로 전달 받은 x 변수(여기서는 array 만큼) 반복 실행
        a.append(1/(1+np.exp(-itr)))  # 반복 횟수는 x array만큼이며, 변경되는 값은 itr입니다.
    return a  # 함수의 반환 값

x = np.linspace(-8, 8, 100)  # numpy의  linspace (start, end, num)를 이용해서 -8과 8사이에 100개의 값 생성
sig = sigmo(x)  # 앞에서 define했던 sigmo함수 호출 (파라메트로 위에서 생성한 x array 전달)

plt.plot(x, sig)  # matplotlib의 plot 기능을 이용하여 (x, y) 좌표 표수
plt.show()    # plot를 화면에서 볼 수 있도록  show()


2016년 4월 10일 일요일

ML - Sigmoid function

Machine learning이나 Neural Network관련 글을 보면, Sigmoid function에 관한 내용들을 자주 보게된다.
http://roboticist.tistory.com/494
위 blog는 sigmoid function에 대한 설명이 있다.

2016년 4월 6일 수요일

raspberry pi - python editor - geany 설치



command window에서 아래 명령어를 입력하여 geany를 설치한다.

sudo apt-get install geany




참고 : http://www.raspberry-projects.com/pi/programming-in-c/compilers-and-ides/geany/installing-geany
화면 캡쳐는 Ctl+s 키를 직접 눌러주면 됨.
Raspberry pi에서 화면 캡쳐하는 도구가 없어서 답답할 때가 많았다.
걍~ Ctl+s일 줄이야 ~ 

raspberry pi - sklearn 사용

http://hukuzatuna.ddns.net/raspberrypi/2015/09/13/mlsetup.html

위 블로그를 참고하여 설치하는 과정에서 python에서 많이 사용하는 numpy, scipy, matplot 등이 설치된다. Good!!!


만약 python관련, pip install 중 memory 부족 문제를 직면한다면,

pip --no-cache-dir install  을 이용하여 해결

Raspberry pi 3

Raspberry pi 3이 도착해서, 두개의 32GB microSD에 NOOBS을 이용해서 Raspbian 설치 완료

RP3 설치 관련,
1. NOOBS를 다운로드 받아서 설치하는 것이 설치 성공의 비결이다. NOOBS로 설치하면, 바로 무선 Network을 지정해서 설치할 수 있다.
- 설치 이미지를 download( https://www.raspberrypi.org/downloads)하여 Win32Disk Imager를 이용해서 image를 sd card로 전송

- Remote access 준비
$sudo apt-get install xrdp
   --> xrdp를 설치하여 windows remote access를 이용할 수 있도록 조치

- 한글 설정 (참고 : http://blog.naver.com/jinny444/220640576727)
$sudo apt-get install ibus​
$sudo apt-get install ibus-hangul
$sudo apt-get install ttf-unfonts-core
 - Menu / 기본설정 / IBUS 환결 설정 / 추가 / 한국어-Hangul 선택하여 한글 키보드 활성화
 - 한/영 변환은 Shift-Space 키를 누르면 됨.
기본설정 매뉴에서 키보드와 마우스 / 키보드 에서 Keyboard Layout에서 한글 키보드를 선택하면 키보드의 한/영 변환키를 사용하여 한영 변환 가능

잘되던 wifi가 안되는 현상이 발생한다면,
이유는 Raspberry Pi Configuration / Localisation / WiFi Country 를 변경했기 때문일 것으로 추정 된다. 따라서, WiFi Country Korea를 다시 GB로 변경하면 해결!!!

2. Scratch로 Raspbian을 다운받아서 설치하다가 무선랜 설정부분에서 막히기 시작해서... 한참을 고생했던 생각이 난다. 난 RP3가 고장난것이 배송된 줄 알았다.

case에 RP3를 고이 모셔둔 상태.
USB 전원, Keyboard, Mouse, micro SD, HDMI 연결하면 Raspbian으로 들어 간다.


Windows에서 remote access를 통해서 접속한 화면