Git을 이용한 웹애플리케이션 배포

web application을 배포할 때, FTP를 사용해서 코드를 웹서버에 덮어 씌우고 데몬을 껐다켜서 코드를 활성화시켜왔다. 이런 식으로는 코드관리를 어렵고 수정한 코드에 문제가 생기면 백업본을 찾아야 하는등 어려움이 많았다.  그래서 Git을 이용해 웹애플리케이션을 배포하는 방법을 생각해본다.


Object:
local(windows)
코드수정 --> web-server로 수정된 git정보 전송(push)
web-server(ubuntu)
수정된 코드 반영하기 위해 웹앱 재시작.


Todo :
ssh를 이용해 웹서버와 통신
server에 접속할수 있는 ssh key가 windows에 존재해야합니다. Amazon EC2를 서버로 사용할 시에 접속 private key(pem)를 처음생성되서 다운받습니다. 이 key는 putty 클라이언트를 이용해 사용하기도 하죠. 여튼 이 key를 git이 사용하겠금 해야 합니다. 윈도우용 git을 다운받으면 bash를 이용해 조작합니다. 이 bash에 홈에 보통 /c/Users/Home 이런식으로 되어있습니다. 여기에 .ssh라는 숨김 폴더가 있습니다. 이곳에 키를 보관하고 설정을해놓으면됩니다.


이렇게 되어있습니다. pem확장자로 파일명은 보안을 위해 일부러 지웠습니다. 이 파일을 이용해 ssh로 server접속이 가능합니다.

server 쪽에서는 ~/.ssh에 autholized_keys란 파일에 client의 public key를 가지고 있어 private key를 확인하고 접속시킬수 있습니다.

$ssh -i xxx.pem ubuntu@123.122.21.11

이런식으로 ssh로 server에 접속할수 있습니다. 이것이 되는지 확인하면 이제 server에 git 저장소를 만들고 그곳에 지금해놓은 것들을 넣어야합니다.

아, 이렇게 ssh를 접속하면 되는데 나중에 git으로 ssh접근을 할때는 key파일을 추가하는 옵션이 없어서 ssh 접속에 별명을 만들어놔 그 별명을 사용하면 정해놓은 곳으로 정해놓은 key로 접속할 수 있어야합니다. 그것은 ~/.ssh 폴더에 config파일을 만들어놓으면됩니다. 그러면 ssh접속할때 알아서 그 파일을 보고 별명을 찾아서 그에 맞는 옵션값을 설정합니다.


이렇게 config파일에 작성해놓으면 됩니다.  그렇면

$ssh nickname 

으로 간단하게 hostname에 접속가능합니다.


server에 저장소만들기.
git 저장소를 만드는것은 서버에서 마음드는곳에 디렉토리를 하나만들고, 저는 /opt/myproject.git에 만들게요. 그리고 그 디렉토리를 git저장소로 사용하겠다. 선포합니다.

$mkdir myproject.git
$cd myproject.git
$git init --bare

저장소로 사용되는곳은 .git으로 끝내는게 관례라네요. 이렇게 저장소를 만들어놓고 지금까지 개발하고있던 코드들을 서버로 옮깁니다. ssh의 파일전송 명령을 이용합니다.

$ scp -r gitdirectory nickname:/opt/my_project.git

이렇게 하면 서버의 /opt/git에 gitdirectory가 전송되면서 서버와 local이 같은 코드를 가지고 있게 됩니다.

local과 server와 동기화.
그렇다면 이제 local에서 clone을 만들어서 개발중인 코드를 동기화 시킬수 있습니다. local에서

$git clone nickname:/opt/git/my_project.git/gitdirectory

이렇게 명령어를 입력하면 gitdirectory라는 git remote가 웹서버인 디렉토리가 생깁니다. 이제 이곳에서 코드를 수정하고 커밋하고 푸쉬하면 서버의 gitdirectory도 같이 동기화가 됩니다.

그렇다면 다음엔 local에서 push했을때 저절로 웹서버를 껏다켜 새로운코드를 적용할수 있도록 하는것을 배워보겠습니다.

Bitcoin(2)

이전 포스트에서 말했던것과 같이 Bitcoin을 신뢰성있고 투명하지만 익명성있는 그렇게 만 있었던 algorithm, Block chain에 대해서 파고 들어가보자. Block chain은 말그대로 Block이 chain을 형성하여 여러개가 얽혀있는 관계다. 종이가 없던시절 대나무를 종이처럼쓰던 시절이 있을것이다. 이때 대나무를 여러개 엮어서 하나로 가지고 다녔다고 하는데 맞는것인진 모르겠다. 그래서  이 책이라는 한자가 이러한 모양이 나왔다고 어디서 주어들었는데 찾아보진않았다. 여튼 이렇게 하나로 엮은 모양의 Block이라는 것이다. 그럼 흐름을 보면서 이해해본다. 운이좋게도 누군가 인포그래픽을 사용해서 한눈에 보여주었다.

Joshua라는 친구가 이렇게 한눈에 보기쉽게 만들어줬다. 고마워 Joshua. 그럼 하나하나 짚고 넘어가보자. 

우선 내가 곽진산한테 비트코인을 보낸다. 이때 필요한게 비트코인 지갑인데, 컴퓨터에 설치되어있는 프로그램이라고 생각하면되겠다. 이 프로그램은 내 지갑이되며 이 지갑내에서 여러개의 계좌를 관리할 수 있다. 계좌는 복잡한 여러글자로 되어있다. 아마 곽진산도 이런 복잡한 계좌글자를 가지고 있을것이다. 하지만 이 컴퓨터 세상에서는 복잡함은 필요없다는 걸 알고있다. 왜냐하면 control+C,V가 있기 때문이다.

나의 계좌에서 상대방의 계좌로 이제 비트코인을 쏴줄것이다. 그럼 이제 계좌를 고르고 얼마를 보낼지 정한다음에 "쏴주기"를 클릭하는 순간, 사용자는 모르는 엄청난 일을 하게된다.

우선 첫번째로 내 계좌인지 알아보기 위해 암호를 풀어야한다. 이때 자신이 가지고있는 비밀키로 이 암호를 풀면 내가 이 계좌의 주인이라고 확인을 시켜줄 수 있다. 비밀키-공개키 알고리즘은 암호학의 기초로서 단방향성을 가진 함수를 사용한다. 즉, 2개의 수를 곱하는건 누워서 떡먹는 수준이다. 하지만 어떠한 큰수가 어떤 소수들로 나누워질수 있는진 알기힘들다. 소인수분해의 어려움을 가지고 이 알고리즘이 작동하는것이다.

여기서 두 수를 곱한건 공개키가 되고 이 공개키를 소인수분해 한 것이 비밀키가 된다. 즉, 공개키를 보여줘도 다른사람들은 이 암호를 풀지 못하게 된다. 이  자세한건 이 글 전체의 몇배를 써야될지 모르기 때문에 기회가 되면 따로 포스팅하겠다. 

여튼 비밀키로 내 계좌인것을 입증시켜주면 이제 그사람한테 보내면끝인가? 아니다. 이 것은 내 계좌가 맞는지 아닌지만 확인한거다. 이제 이 계좌에 돈이 있는지 없는지를 확인해야한다. 이것을 확인하는 방법이 블록체인 알고리즘으로서 향후 여러 확인시스템, 공유시스템을 이루는데 많이 사용될것으로 보인다. 귀아프게 들었을지 모르겠지만 이제 사물인터넷, 유비쿼터스니 뭐니하며 컴퓨터의 연결에 대한 새로운 이름을 붙이는 것 자체가 진부해져버린 세상이 되어버렸다. 이제 너무 당연하게 네트워크로 연결되어 데이터를 공유하며 작동한다. 이런 공유시스템에서는 어떤 작업을 했니, 안했니, 그렇다면 안전하게 잘해서끝냈니 안끝냈니등의 협업 시스템이 구축되어야 한다. 이러한 문제들은 컴퓨터가 작업을 공유할 때부터 논의되어왔다. 하지만 풀기어려운문제로 남겨져있었다. 비잔틴장군의 문제로 알려져있다.

비트코인은 이 확인하는 방법에 있어서 비트코인이 근간이되는 핵심적인 알고리즘을 사용한다. 블록체인이라는 것인데, 거래 내역이 적혀있는 블록을 연결고리처럼 생성하므로 붙여진 이름이다. 이 거래내역서를 네트워크에 연결되어있는 사용자들이 모두 가지고 있다. 그리고 이 거래내역서는 중앙에서 관리하는것이 아니라 모두가 같이 관리한다. 

이 거래내역서에 10분에 한번씩 거래내역을 추가하게 되는데, 추가할때 상당한 연산이 필요한 계산을 하게된다. 그리고 거래내역에 안정성을 위해 네트워크에 연결된 과반수가 인정하는 거래만을 기록한다. 즉, 이때 악의적인 이용자가 거래내역서를 조작해서 네트워크에 뿌려봤자 채택이 되지않는다. 왜냐하면 악의적인 이용자보다 그렇지 않은 사람이 많기 때문이다. 2013년 말에 벌써 세계의 슈퍼컴퓨터 1~500위까지의 연산능력을 더한 것보다도 더 많은 컴퓨팅 능력을 비트코인 네트워크가 가지고있다고한다.

그리고 이것을 만든 사토시님이 머리를 잘쓴게, 블록체인을 생성하는 계정에게 인센티브를 제공한다. 그리고 이 블록체인을 생성하는것을 채굴이라고하는데, 인센티브가 주어지므로 금을 캐는 것에 빗댄표현이다.

인센티브는 갈수록 연산이 어려워지고(매 2016블록 마다), 채굴로 제공되는 비트코인은 4년마다  기하급수적으로 줄어든다. 그리고 2100만개가 다 공급되면 더 이상의 채굴은 없어진다. 즉 비트코인의 총량이 정해진것이다. 아마 그이후에는 거래수수료가 인센티브로 돌아올것이다. 

그럼 총량이 정해져 있다면 점점 화폐가치가 올라가는 디플레이션이 올것이다. 이 문제는 1비트코인을 소수점 8자리까지 분할해사용할 수 있으므로 상품의 가격하향에 반응 할 수 있게 했다. 
Bitcoin(1)

Bitcoin(1)

'비트코인은 가장 완벽한 화폐이다'라고 까지 말해지며 비트코인의 가치는 2013년이후 폭발적으로 올라 지금은 현재 1BTC당 590USD에 거래되고 있어요. 과연 비트코인의 어떤 면이 화폐로써 혹은 투자가치로써 이렇게 인기를 끄는 건지 궁굼하네요.


우선 비트코인의 특징을 볼까요?
0. 가상화폐이다.
1. 정부나 은행과 같은 중앙권력기구가 없죠.
2. 누가 어떤 거래를 했는지 알수 없어요. 익명성이 보장되죠.
3. 그러나 언제 어떤거래가 이루어졌는지는 모두다 알수 있는 공개성이 있죠.
4. 여기서 일어나는 거래들은 모두 암호화되어있어요.
5. 발행의 한계가 있어요.

비트코인은 가상화폐에요. 실물이 없죠. 천원이면 이황선생이 있어야하고 오만원이면 신사임당이 웃고있는 그런 화폐가 아니라는 거죠. 그렇다면 마일리지나 포인트같은 개념일까요? 그것도 아닙니다. 

유럽중앙은행에서 가상화폐를 세종류로 나눴습니다. 하나는 현실화폐와 환금 및 교환이 불가능, 가상의 재화나 서비스만 이용가능한 겁니다. 예를들면 뭐가있을까요? 음...넥슨캐쉬같은 거죠. 게임할때 쓰는 사이버머니들이죠. 아바타에 사탕하나 물려줄려면 3000원 입금해야되죠. 근데 이건 그 안에서만 사용해야되죠. 

두번째는 첫번째 가상화폐가 확장된 개념으로 현실화폐와 환금및 교환 불가, 현실에 서비스나 재화에 사용가능합니다. 즉 이모티콘을 살수도있고, 기프티콘으로 바꿔서 아이스크림도 먹을 수 있는 카카오같은거죠. 하지만 원이나 달러로는 교환하지 못합니다.

마지막 세번째는 현실화폐와도 교환가능한 겁니다. 비트코인이 바로 이 단계에 속하는 가상화폐입니다. 음...생각해보면 리니지 아이템같은건가요? 아니면 한게임 포커머니? 이런건 정망치한테 물어봐야되는데.. 여튼 상당히 제한적인 곳에서 사용되었습니다. 이제 이 비트코인이 등장하면서 가상화폐를 완성시켰습니다.

우리가 사용하는 원이나 달러등의 화폐는 국가 혹은 은행이 보증을 스는 채권같은 거죠. 그래서 나라가 휘청할 때마다 화폐들은 폭락, 폭등하게 되죠. 

그런데 그러한 채권형태의 화폐가 아니라면 걱정할 필요가 없겠죠? 바로 금같이 말입니다. 간단하게 금은 생산량이 한정적이고 누구나 가치있다고 생각하기 때문에 가격급락이 없는 기본적인 화폐입니다. 그래서 금을 찬양하는 사람들이 생겨났죠.이러한 금의 특성을 비트코인은 가지고 있습니다. 비트코인은 생산량이 한정적이죠. 그리고 중앙에서 관리하는 기구가 없기 때문에 특수한 나라의 경제상황이나 정치상황에 덜 민감하겠죠. 

그러면 이러한 중앙기구가 없는데 누가 거래의 무결성을 보장할 거죠? 즉, 내 통장의 100원을 다른사람한테 줬으면 내통장에서 100원이 없어져 더이상 사용못하고 그 사람이 사용할수 있어야하는데.... 지금은 그 일을 은행이 하고있으며, 은행들의 울타리 속, 데이터센터 속, 보안구역 속, 굳게 닫힌 철문 속, 한정된 사람들만들어 갈수 있는 서버에 들어있어요. 이걸 비트코인은 대중, 즉 비트코인을 지지하는 사람들에 의해 이 무결성의 장부를 실현해요. 이것이 비트코인을 성공적인 화폐로 세울 수 있는 알고리즘입니다. 다음 포스팅에 이 알고리즘을 중점적으로 설명해볼게요.

Multiple Instance Learning Track (MILTrack)

Multiple Instance Learning Track (MILTrack)

이 글은 Boris Babenko의 Visual Tracking with Online Multiple Instance Learning 논문을 review한 것이며 자세한 수식이나 배경지식은 필자의 귀차니즘으로 인해 이 글에 담지 못했음. 논문을 읽기전, 간단히 이해하는 수준이 필요하다면 이 포스트로 충분하다고 생각함.

MIL Tracking

이제 본격적으로 Image tracking by detecting을 시작해볼건데요. 이전에 사실 Online Discriminative Feature에 대한 논문을 읽었어요. 그 논문에서 MILTrack과 비교하며 설명하는데 이것을 알아야 그 것도 좀 더 쉽게 이해될 것 같아 읽어봤네요.

MIL은 Multiple Instance Learning의 약자로 여러개의 Instance를 학습하는 classifier를 만드는 거라고 대충은 알아낼 수 있겠죠. 뭐 방법이야 어쨌든 여기에서는 결국 원하는 물체를 화면에서 찾아서 따라다니는 겁니다.

그걸 잘찾는 알고리듬을 계속 변형하거나 업그레이드해서 더 잘 따라다니게 하는것이 이 분야의 길인 것 같습니다. 그러므로 요즘 트랜드의 방법이나 알고리듬을 뜯어보면 여러 단계를 거쳐 진화했다는것을 알수 있을 것입니다. 여기서도 몇가지 방법이 융합되거나 업그레이드되었네요.


1. 사용된 기술

  1)Online MIL Boost
  2)Stump for weak classifier
  3)Randomized Haar-like feature
  4)Simple motion model greedy local search


2. Algorithm

우선 Tracking이 진행되는 순서부터 설명합니다. 이 것은 여느 Tracker와 비슷합니다. Appearance를 Box를 이용해서 자르고 positive, negative를 구분해 학습하네요.

  1). 이미지를 자른다. 이때 $x$와 이전 프레임의 tracked location와의 거리가 $s$이하
이어야 한다. 그리고 그 $x$들의 feature vector($X_s$)를 뽑아낸다.

  2). MIL classifier를 이용해서 $X_s$안에 $p(y=1|x)$를 측정한다.

  3). 측정한값을 가지고 가장 큰 $x$를 찾아서 거기를 새로운 tracked location으로 만든다.

  4). 이번엔 두개의 이미지를 자른다. 하나는 tracked location 거리와 $r$이하로 떨어진 $x$들(positive samples), 또 하나는 $r$보다는 크고 $b$보다는 작은 $x$들(negative samples)의 이미지를 자른다.

  5).MIL appearance model을 하나의 positive bag과 여러개의 negative bag을 가지고 업데이트한다.

여기서 AdaBoost와 다른점은 MIL을 사용하는 부분(appearance model에서 Bag을 사용한다는 것)이 특별합니다. 당연히 appearance model이 다르니깐 classifier가 달라지는것을 생각한다면 달라진 appearance model을 중점적으로 보면되겠네요.

이 Bag이란 것은 positive한 feature가 하나라도 들어있으면, 그 Bag에 들어있는 instance들 모두 positive로 labeling됩니다. 그에 반에 instance모두가 negative feature 이어야 그 Bag이 negative로 labeling되는 거죠. 즉 어떤 범위를 모두 positive로 보아서 그 영역을 찾습니다. 마치 여자인지 판단할때, 머리길이, 신체사이즈, 얼굴생김새, 목소리를 모두 보고 판단하는 것과 같습니다. 어 머리길이만 보고 좀 기내? 여자인것같다. 이렇게 하나의 feature만 보면 틀릴 확률이 더 크겠죠.

그럼 각 instance를 따로 학습하지 않고 Bag을 사용하는 이유는 Tracker를 헷갈리게 하면 안되므로 그러는건데요. 한 물체를 Tracking 할때 시간이 지날수록 Tracking하는 곳이 모호해지고 빗나가게 됩니다. 여러개의 인스턴스를 가지고 있으면 더욱 그러하겠죠? Tracking이 되더라도 tracked location이 자주변경되 Box가 흔들리고 안정적이지 못할겁니다. 물론 그 와중에 계속 새로운 positive를 학습하니깐 tracker는 더 헷갈릴것이고요. 그러므로 Bag을 이용해 여러개의 positive sample들을 사용하면서 헷갈리지는 않는 tracking을 할 수 있어요.
기계학습 그리고 패턴인식.

기계학습 그리고 패턴인식.

기계학습에 있어서 패턴인식은 가장핵심적인 부분인 동시에 대체되는 단어로도 사용할 수 있을 것 같에요. 인공지능 프로그램은 상황을 인지할 때, 어떤 패턴을 이용하여 인식한 후에 원하는 행동을 하게 되는 것이겠죠. 즉 학습하기 위해서는 인지한 것을 자기것으로 소화시켜야 하는거죠. 그 부분이 패턴인식이고요.

패턴 인식

Pattern Recognition system은 어떤 객체를 분석해서 올바르게 분류해내는 시스템이에요. 사물을 보고 어떤 물체인지 알아내거나 어떤 행동을 하기 위한 기준을 만드는 것이죠. 이러한 작업에는 공통된 일련의 작업들이 있어요.

1. sensing
2. pre-processing and segment
3. feature extraction
4. classification

5. post-processing

대충 제목들만 봐도 알겠죠? 인공지능과 흡사하기때문에 사람이 인지하고 생각하기까지를 예를 들어볼게요.

1. sensing은 인간으로 치면 오감을 이용해서 상황을 느끼는 거에요. (여자들은 sixsense를 가지고 있다는데 정말인가요?)
2. pre-processing and segment 는 전처리부분으로 눈이 않 좋은 사람들이 안경을 끼는 것과 비슷하죠. sensing을 더 확실히하기 위한 방법이죠. 노이즈가 많은 음성데이터나 영상데이터등을 분석하기전에 좀 더 깔끔하게 하는 것입니다.
3. feature extraction은 여자를 볼때 얼굴, 가슴, 다리, 엉덩이, 목, 어깨, 팔,,, 성격 등을 보며 판단 하는 것과 같습니다. 이렇게 sensing으로 얻은 데이터를 feature로 표현해서 판단의 근거를 만드는 것이죠.
4. classification 으로 위의 feature들을 가지고 판단을 하는 부분입니다. 사전에 데이터를 가지고 이 정도면 Positive이다, Negative이다 선택 하는 것이죠. 이전에 Positive와 비슷한 feature들을 가지고 있으면 Positive라고 분류될 확률이 크겠죠?
5. post-processing은 위에서 잘못판단을 할 수도 있으니깐 최대한 맞추려고 노력하는 것입니다. 한가지 예로는 사진을 인식할 때 바다 한가운데 피아노가 있으면 이상하니깐 이 피아노는 잘못된 분류라고 생각하는 것입니다.

이 단계들은 모두 중요합니다. 그런데 제가 하려는 패턴인식은 3번과 4번이 중점이 되겠어요. sensing은 하드웨어 쪽에서 카메라를 잘만들고 자이로센서, 마이크등 센서를 잘만드는 분들이해 주셨으니 전 열심히 최선을 다해서 특징추출하고 분류해서 답내고 또 답이 잘안나올거같으면 후처리를 합니다.


특징생성
특징생성이란 단어가 특징추출로도 쓰이기도 합니다. 여기선 특징생성은 특징을 추출해서 그러한 특징을 선택하는 것까지 를 특징생성이라고 할게요. 즉, 특징생성 = 특징추출+특징선택

위에서 말한것과 같이 어떤 객체를 분류하기전에 그것을 대표할 특징들이 필요하겠죠. 이것을 특징벡터라고할게요. 이 특징벡터은 첫째, 분별력이 좋아야하고 둘째는 또 차원이 낮아야합니다. 어떤 특징들의 분별력은 좋지만 계산할 때 너무 오래걸릴만큼의 차원이면 실용적이지 못하겠죠. 반대로 계산이 가능할 정도의 차원이지만 분별력이 낮은 특징벡터는 쓸모가 없겠네요. 그러므로 이 두가지를 고려해서 특징벡터를 만들어야해요.


특징 추출

특징생성에서 데이터의 종류가 무엇인가에 따라서 2차원 이미지인가, 음파처럼 파형을 이루는 데이터인가 등등 실세계에 나오는 데이터마다 추출방법이 바뀔 수 있고 데이터의 종류가 같더라도 분류방법에 따라서도 바뀔 수 있어요. 그리고 데이터의 종류가 같고 분류방법이 같아도도 어떤 객체를 구분해낼 것인가, 어떤 상황에서 그객체를 구분해 낼것인가에 따라서 추출방법이 다양해요


특징 선택

특징선택은 특징추출에서 나온 특징벡터에서 필요한 특징만을 뽑아내 차원을 줄이는 단계에요. 이 필요한 특징을 추려냄에 있어서 특징마다 분별력을 측정해야죠. 분별력이란 그 특징이 가지고 있는 성질로, 같은 특징부류이면 동일성을 같고(분산이 작은) 다른 특징부류들과는 구분될수 있는 (분산이 큰) 능력을 말해요. 분별력을 측정할수 있는 방법은 여러가지가 있네요. 예를들면 KL divisions, training sample distance 측정, 특정한 classifier를 위한 selection 등등. 이렇게 분별력을 토대로, 생성된 특징벡터에서 쓸모 없는 특징을 빼내면서 특징 벡터를 최적화하는 거죠. 이 때 부분집합 선택문제를 가지겠죠. 즉, 분별력이 높은 특징들만으로 특징벡터를 만든다고 그 특징벡터가 가장 좋은 특징벡터라고 말할 수 없는거죠. 어떤 특징들로 한 객체를 표현하는데 구분력이 높은것만 가져다 놓을때엔 조합의 문제를 신경쓰지 않은것 이므로 오히려 더 않좋은 특징벡터가 될수 있는것이죠. 예를 들면 이쁘고 안이쁜 여자를 구분할 때 허리사이즈와 몸무게그리고 키가 있는데,개별적으로 봤을때 몸무게로 구분하는게 가장 구분하기 쉽고, 그 다음 허리사이즈 마지막으로 키로 구분할때 가장 쉽다는 결과가 나왔다고 해볼게요. 그러면 몸무게와 허리사이즈를 선택해야할까요? 아니죠. 몸무게와 허리사이즈는 어느정도 연관관계가 있어서 몸무게만봐도 허리사이즈를 어느정도 가늠할수있습니다. 그러므로 몸무게와 키를 선택하는게 가장 좋은 특징벡터일수 있죠. 이렇게 특징 을 선택할땐, 최종조합의 분별력도 고려해야되요.




AdaBoost

AdaBoost
AdaBoost는 Boost의 종류의 하나로 Adaptive Boot의 줄임말입니다. 적응한다는 것인데요. 어디에 적응하냐 하면 'error'에 적응하는 것입니다.

샘플을 잘 살펴보고 에러를 최소화 할수 있는 weak classifier로 분류를 합니다. 그래도 error가 생기는 샘플이 있을 수 있겠죠? 원래 Positive인데 Negative로 분류되었거나 그 반대인 경우입니다. 이 error가 발생한 샘플에 가중치를 더 두고, 다시 그 것을 잘 분류 할 수 있는 weak classifier를 고릅니다. 그리고 다시 에러 난 샘플에 가중치를 더두고 weak classifier를 찾습니다. 이 행위를 여러 번하면 충분한 weak classifier들을 만들어지고, 그 것들을 합치면 가지고 있는 샘플들에 대한 에러가 거의 없게 되겠죠. 그 합친 classifier를 Strong classifier라고 부르며, weak classifier들의 선형 조합으로 표현됩니다.
$$F(x)={ \alpha }_{ 1 }{ f }_{ 1 }(x)+{ \alpha }_{ 2 }{ f }_{ 2 }(x)+\cdots +{ \alpha }_{ n }{ f }_{ n }(x)$$
여기서 $F$는 strong classifier, $\alpha$는 weight, $f$는 weak classifier 입니다.

Pseudo-code
입력: 라벨링된 데이터
w를 초기화한다.
T번 반복(T개의 weak classifier)
    weighted error를 보고 가장 좋은 weak classifier를 선택해 추가한다.
    틀린 샘플에 weight를 더 준다.
T개의 weak classifier를 합쳐서 Strong Classifier로 만든다.


밑에 애니메이션을 보면 이해하기 쉽습니다.
AdaBoost 애니메이션 from a presentation by Qing Chen, Discover Lab, University of Ottawa

통계에 있어서 기본적인 것들(3)

통계에 있어서 기본적인 것들(3)



저번에 다중비교와 자유도 그리고 분포까지 알아보았는데요. 역시 별로 어려울게 없습니다. 고수준의 이해를 필요로 하지도 않고요. 이제 여기에 포스트된 것까지만 하면 통계의 기본은 끝납니다. 그 다음부터는 적용의 문제가 기다리고있죠. 언제 어떤 분포를 사용하고 언제 어떤 방법으로 통계치를 분석할 수 있을 지 등등이요. 하지만 이 통계에 기본에 기초하고 있는것이라 사용하는데에는 큰 문제 없을거에요. 그럼 오늘은 중심극한정리모수적방법 그리고 자료의 정규성검정까지 알아볼게요.

중심극한정리

중심극한정리는 "많은 수의 표본이 있으면 그 표본의 합이나 평균이 정규분포를 따른다." 라는 말인데요. 이렇게 적어놓으면 어렵죠. 정육면체의 주사위를 열번정도 굴리면 어떤 숫자는 적게나오고 어떤 숫자는 더 많이나오고 어떤숫자는 아예 안나올 수도 있죠? 그런데 수백번,수천번 굴렸다고 해보죠. 그럼 각각의 나온 횟수가 1/6에 근사하게 나올겁니다. 그렇다면 주사의를 두개를 수천번 굴려서 그 합을 나타내볼까요? 그렇다면 아마 기대값에 가까운 숫자는 높게 그와 떨어진숫자들은 점점 적게 나올겁니다. 마치 정규분포의 모양처럼요.

이렇게 표본을 충분히 많이 확보할 수 있으면 그 표본변수의 합이나 평균같은게 정규분포를 따른다는 말이에요. 그 원래 모집단의 분포에 따라서 그 표본의 개수는 차이가 있겠죠. 분산이 큰 표본은 더 많은 수의 표본을 필요로 하고 이런것들이요. 그러나 모집단의 분포를 몰라도 표본이 충분히 크다면 구지 신경안써도 되는 부분입니다.

이렇게 중심극한정리를 이용하면 집단간에 평균비교로 집단차이를 비교할수 있고요. 또 정규분포라는 가정하에 하는 실험들도 많이있습니다.


모수적방법 VS 비모수적방법

추출된 표본의 평균이나 분산 표준편차 같은걸 통계량이라고 하고요. 원래 모집단의 평균 분산 표준편차를 모수라고 합니다.

그런데 위에서 봤듯이 겁나 많은통계의 평균혹은 분산은 정규성을 띈다고 볼 수 있으므로 그것을 이용한 것이 모수적방법입니다. 이때 표본의 크기가 작다고 생각될때 정규성 검정을 할 수 있죠. 정규성 검정은 밑에서 다시설명하겠습니다. 

그런데 정규성검정에서 떨어지거나 표본이 얼마없는 소규모의 실험은 순위합검정 같은 비모수적 방법을 사용합니다. 이것도 대부분 모수적방법과 비교해봤을 때 만약 표본이 정규분포를 따를때에도 검정력이 크게 떨어지지는 않는다합니다. 그리고 표본의 분포가 멀리떨어진 경우에는 어쩔 수 없이 비모수적 방법을 사용해야겠지요.

그러나 모수적방법의 선호 이유는 검정력이 다소높고 비교 군 사이에 크기차이가 있는 경우엔 차이정도도 함께 제시할 수 있기때문입니다.


정규성검정

위에서 말했듯이 통계적방법들은 보통 정규분포를 따른다고 가정합니다. 그러나 모든 표본이 정규분포를 따르는 것은 아니기 때문에 이 정규성 검정을 거쳐야 될 때도 있죠. 표본수가 10개보다는 많은데 그렇다고 충분할 정도로 많지 않으므로 정규성검정을 거치는 거에요. 검정방법은 Kolmogorov-Smirnov Test와 Shapiro-Wilk Test가있습니다.
통계에 있어서 기본적인 것들(2)

통계에 있어서 기본적인 것들(2)





지난번 독립변수, 종속변수, 자료분류, 가설검증방법, 유의수준에 이어서 이번에도 통계에 있어서 기본적인 것들 다중비교, 자유도 그리고 분포를 알아볼게요.

다중비교

A = B = C 라는 것을 검증할 때 흔히 하는 실수가 있습니다. 유의수준을 5%라고 하면 A = B를 검증할때도 5%이하의 오류율을 보이고 B=C를 검정할때도 5%, C=A도 5%이렇게 된다면 전체 실험의 유의수준은 5%보다 훨씬 올라가겠죠? 예를 들면, 유의수준5%는 원하는 가설을 채택했을때 그 채택한 가설이 참이될 확률을 95%이상이 되겠금하는 것이죠. 그런데 한번의 가설을 채택하는데 유의수준을 각각 책정한다면 최종적으로는 .95 x .95 x .95 = .857 밖에 맞을확률이 없는 것이네요. 그러므로 이런 다중비교를 할때는 전체유의 수준이 5%를 넘지 않도록 해야하죠. 이렇게 동시에 비교를 하기위해서 Bonferroni, Turkey, Ducan, Scheff 방법등이 있어요.


자유도

자유도는 실질적으로 독립인 값들의 개수이죠. 그렇다면 m개값의 평균을 낼때 그 자료의 자유도는 m-1이죠? m-1개의 값이 정해지면 나머지 1개는 저절로 정해지니깐요. 그리고 m x n의 교차표는 (n-1) x (m-1)의 자유도를 가집니다.


분포

동일한 실험을 여러번 하고 그 실험의 결과값을 그래프로 그려보면 특정한 모양을 띕니다. 평균값에 몰려있고 평균과 멀어질수록 적은 결과를 가지고있는 모양이 대부분이죠?

파일:Normal Distribution PDF.svg
정규분포

파일:Student t pdf.svg
T-분포

파일:Chi-square distributionPDF.png
카이제곱 분포
푸아송 분포
                               
정말 여러 모양의 분포들이 있죠? 이런 분포들은 쓰는 상황이 각자 다릅니다. 그래서 이렇게 많이 만들어져 있겠죠? 사용하는 이유는 이러한 분포모양을 예측함으로써 많은 실험을 하지 않고도 어떤 값이 나올 확률을 알 수 있습니다. 그래프의 아래의 면적을 모두 합치면 1이됩니다. 그러므로 어떤값 이상이나 어떤값이하가 나올 확률을 면적으로 구하면 되는거죠. 그러한 면적들 값도 표로 정리되어 있어서 가져다 쓰는 방법만 알면 복잡한 적분없이도 확률예측을 할 수 있게됬어요. 고맙네요.






통계에 있어서 기본적인 것들(1)

통계에 있어서 기본적인 것들(1)

왜 통계가 어려울까?

통계라는 것은 어렸을때 중학교,고등학교 때부터 확률의 연장선으로 항상 따라다니던 부분이죠. 그 만큼 중요성과 활용성은 학창시절 배우는 것중의 탑클래스라 생각됩니다. 뭐든 중요하지만요. 그런데도 통계, 확률만 나오면 어렵게만 생각되는 이유는 뭘까요? 매번 큰 그림없이 간헐적으로 기법들만 배우다보니 그런것이 아닌가 생각됩니다. 이런 생각도중에 책한권을 소개받았습니다. "닥터 배의 술술 보건의학통계" 라는 책인데요. 이 책은 통계의 기본을 가지고 의학에 필요한 실험, 분석등을 예시로 들면서 설명하는 책입니다. 여기서 나오는 의학적인 내용은 상당히 기본적이므로 통계를 배우는데에는 지장없을 정도입니다. 뿐만아니라 그림 예시가 많으므로 그 만큼 독자들의 이해정도는 더 높아집니다.

이 책에 있어서 가장 중요한 부분은 첫 번째에 나와있습니다. 통계방법을 설계하고 기법을 선택할 수 있는데 있어서 기본인 부분입니다.


독립변수 vs 종속변수

우선 독립변수와 종속변수의 관계부터 이해하죠. 독립변수는 어떤 상황에 있어서 독립인 변수죠. 전의 실험이나 확률에 대해서 영향 받지 않는 변수입니다. 그 반대가 종속변수이므로 종속변수는 그 전의 변수에 의해서 영향을 수이죠.  


자료 분류

자료들은 분류될수있겠죠? 이 분류하는 방법에 따라서 discrete과 continuous으로 나눌 수 있습니다. discrete은 수치화 하기 어려운 것아니면 수치를 구간으로 나누어 순서로 활용할 때 더 이용하기 쉬운 데이터들 입니다. 예를 들면 털이 많다, 적다, 중간이다. 이런 식으로 구분해놓은 데이터는 discrete이고 털이 1센치 제곱만큼의 구역에 몇가닥이 있다. 이런식으로 수량화해놓은 것은 continuous입니다. 그런데 주위할 것은 숫자가 나와서 continuous 데이터로 착각하면 안됩니다. 털이 많고 적음을 5개의 구간으로 나워서 1급~5급까지 나눠 놨다면 이것은 discrete 데이터입니다.


가설검증방법

귀무가설 : 내가 검증하려는 것과 반대
대립가설 : 내가 검증하려는 것

이렇게 놓고 귀무가설을 입증하는 데 귀무가설이 맞을 확률이 0.05% 미만이면 대립가설을 채택하고 귀무가설을 기각합니다. 그러므로 우위성을 입증하냐, 동등성을 입증하냐에 따라서 귀무가설, 대립가설 설정이 다릅니다.

우위성입증인 "A약이 B약보다 효과가 있다"를 입증할 때는 "A약과 B약은 효과에 차이가 없다"가 귀무가설입니다. 반대로 동등성입증인 "A약과 B약은 효과에 차이가 없다"를 입증할 때는 "A약과 B약은 효과에 차이가 있다"가 귀무가설입니다.


5% 유의수준

가설검증에서 귀무가설이 실제로 참일 때 귀무가설에 대한 판단의 오류수준(잘못 기각할 확률)을 말하며, 제1종 오류의 위험성을 부담할 최대 확률을 가설의 유의수준이라고 한다.
[네이버 지식백과] 유의수준 [level of significance] (교육평가용어사전, 2004.5.31, 학지사)
귀무가설을 기각할 때 판단하는 오류수준입니다. 귀무가설이 나올확률이 5%이상이면 귀무가설을 채택하고 대립가설을 기각함으로써 알파오류를 경계하는 것입니다. 가설을 검증하는데 있어서 오류를 2가지로 나눌 수 있겠죠?

하나는 귀무가설을 기각했는데 실제로는 귀무가설이 참인 경우입니다.
두번째는 귀무가설을 채택했는데 귀무가설이 거짓인 경우입니다.

그런데 두번째 경우에는 내가 검증하려는 것과 반대의 결과가 나옴으로써 이 실험은 발표되지 않습니다. 그러므로 위험성이 첫번째 경우보다 적다고 할 수 있겠죠? 첫 번째는 대립가설이 채택되서 발표했는데 사실상 그렇지 않은 경우가 많으므로 위험성이 크다고 할 수 있죠. 그래서 이 오류를 알파오류, 두번째 오류를 베타오류라고 하는겁니다.

이 알파오류가 나올 확률을 5%미만으로 하자고 학계에서 권고를 합니다. 그리고 귀무가설이 기각되었고 실제로도 귀무가설이 거짓일 경우에 (1-베타오류수준)으로  효과를 증명할 수 있습니다. 이것을 검정력이라고 하며 이 검정력을 최대로 하기위해서 많은 실험에서 통계기법을 각자 다르게 사용하는 것입니다.



이 외에 다중비교, 자유도, 분포, 검정통계량, 중심극한정리, 모수적방법과 비모수적방법, 정규성검정 방법 등 여러가지의 기본은 다음에 계속할게요.


Machine Learning은 뭐죠?

Machine Learning은 뭐죠?

Machine Learning이 뭔지 알고 시작해야죠


1) Arthur Samuel은 Machine Learning은 컴퓨터에게 프로그램되지도 안고 배울 수 있는 능력을 주는 분야라고 하네요

2) Tom Mitchel은 Machine Learning은 경험(E)으로부터 계산(P)해서 어떤 일(T)에 대해 배우는 컴퓨터 프로그램이라고 하기도합니다.

  즉, 컴퓨터가 스스로 데이터를 처리하는 일련의 과정인 것입니다. machine learning은 데이터가 방대해진 요즘 가장 각광받기도하고 가장 많이 쓰이는 컴퓨터 과학이기도 합니다. 그래서 예시들도 모두 우리와 밀접해 있어요.
  하루 10억건이나되는 구글의 검색은 누가 랭크를 올리고 내릴까요? 배워먹은 컴퓨터입니다. 수천개의 언론사로 부터 같은 주제의 내용을 묶어 보여주는 것도 컴퓨터가 합니다. 그 외 스팸메일을 막기도하고 사용자에 맞는광고도 보여주고 많은걸 컴퓨터가 알아서하는거죠.

 데이터 홍수를 지나서 쓰나미처럼 몰려오는 지금 이러한 자동 데이터 처리는 필요가 아닌 필수가 되어버린 시대입니다.






1) Arthur Samuel. Machine Learning:Field of study that gives computers the ability to learn without being explicitly programmed.

2) Tom Mitchel. Well-posed Learning Problem: A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.

(위에서 말한 아서와 탐이말한 원본인것같은데 내나름대로 의역했으니 이 원본을 보시고 이해하는 것이 나을지 모르겠네요.)
Supervised learning And Unsupervised learning

Supervised learning And Unsupervised learning


기계학습에는 크게 두 가지 방법으로 나눌 수 있어요. 첫 번째로 supervised이에요.
이 방법은 데이터와 그 데이터가 의미하는 결과 값을 미리 학습시킴으로써 그 외의 데이터들이 어떤 결과 값을 가질 것인지 판단하게 하는 거에요. 그러므로 이 방법은 올바른 결과를 가지고 있는 데이터들을 사용해야 하겠죠?. 예를 들면 교사가 남아서 썩은 음식물, 어디에다도 쓰지못하는 핵폐기물, 모니터가 안 나오는 노트북이란 데이터에 쓰레기라는 결과 값으로 데이터를 입력해주었네요. 그러면 학생은 ‘곽진산’ 을 보고 당연히 이건 쓰레기라는 결과 값을 내놓겠죠. 결국 사전데이터에 입각한 결론을 내는 알고리즘들이 이 방법이라고 할 수 있습니다.

이렇게 사전데이터를 주고 결과값을 받을 땐 continuous한 것과 discrete한 것이 있죠? 예를 들면 내가 어떤 집을하나 장만할려고 해서 그 집을 어느정도 가격에 사야되는건가? 할때는 그 결과값이 1276003656원일수도있고 23412.23원이 될 수 있죠? 그에 비해 이 집을 사야될지 말아야될지를 구분하는 것은 discrete 결과이죠. 이렇게 RegressionClassification을 구분할 수 있겠네요.

두번째는 Unsupervised는 supervised랑 비교되는 몇 가지 특징이있죠. 우선 사전데이터, 그에 따른 결과가 필요없어요. clustering을 생각해보죠. clustering은 데이터들의 속성 값을 계산해서 인접한 데이터끼리 묶어내는 것으로 사전데이터가 필요없죠. 어떤 속성을 측정해서 인접성을 찾아낼 것인가가 중요한 것이죠. 예를 들면 눈,코,입이란 공통적인 속성을 가진 데이터끼리 비교해 이쁘고 착한친구와 못생긴 나쁜 괴물을 구분짓는 것입니다.
OpenCV 시작과 설정.

OpenCV 시작과 설정.


OpenCV 설치.

기본적인 Machine Learning을 배우려고 OpenCV에 손을 댔네요. Computer Vision을 처리하는 라이브러리들이 빼곡하게 차있고, 물론 Open Source이므로 소스까지 공개되어있어 이쪽 분야에선 아주 널리널리 사용하고 있어요.
OpenGL은 그래픽을 표현하는 쪽이라면 OpenCV는 그래픽을 가공처리하는데 필요합니다.

OpenCV는 C++,java ,python등으로 사용할수 있나봐요. 물론 python에 대한 유혹을 뿌리치지 못했지만 교수님이 C++이나 Java를 원하시는 것같아 C++로 하기로했습니다. 오랜만에 VS를 켜봅니다.

이런 라이브러리 사용할땐 역시 컴파일문제가 일어날 수밖에 없죠. 저도 간만에 컴파일언어를 써보는지라 삽질좀 하면서 설정을 마쳤네요.
cmake를 사용해서 작업환경에 맞게 빌드한 다음 사용할 lib 폴더, dll폴더의 경로를 설정만 해주면 됩니다.

cmake로 컴파일하는방법
http://blog.naver.com/PostView.nhn?blogId=lithium81&logNo=80123195965

visual studio directory 및 dll 링크 방법.
http://gyeongju.tistory.com/19

블로그 고르고 설정하기까지.

블로그 고르기

블로그를 운영하는데 있어서 가장 눈에 띄고 또 가장 처음 필요한건 템플릿 변경이라고생각해요. 우선 나부터 들어오고 싶어야 뭘 올리든 말든하겠죠. 그래서 뭐 다들 같고 뻣뻣한 형식의 블로그들보다 디자인들을 수시로 바꾸고 고치고 할 수 있는 이 블로거가 저한텐 짱인거같에요.

보니깐 블로그도 종류별로 나눠져있더라고요? 뭐 설치형, 가입형으로 나누기도 하고 목적에 따라서 단문형 장문형도 나누기도 해놨더라고요.

네이버, 이글루스, 싸이월드, 티스토리 뭐 사람들마다 각자 선호하는 것 필요하는것 모두 달라서 무엇이 좋다고 말은 못해요. 하지만, 전 꽉막힌 네이버나 이글루스, 싸이월드는 싫고 티스토리 할려고 했더니 무슨 초대장?이 필요하데, 난 누구 생일잔치도 초대못받아서 서러운데 블로그하나 하려는데도 초대받아야하다니... 여튼 다따져봐도 블로거가 나한텐 딱.

이정도로 유연한데 호스팅할 필요도 없고~

템플릿 고르기

누가 인생은 선택의 연속이라 했던가? 쟁쟁한 블로그 제공자들 중에 하나 고르고 나니깐 또 이 템플릿이라 불리는 블로그 껍데기를 고를 차례네요. 그래서 여기서도 내가 필요한거 몇개 적어놓고 가장 적합한거 눈에 보이면 바로 골르고 뒤도 안돌아볼거임. 껍데기는 나중에 바꾸는데 문제 없으니깐! 그래서 거지인 나에게 무료이고, 심플하고, 글이 많이~ 있어도 분류하거나 찾아보는데 어렵지 않을 정도의 카테고리나이징이 조건이에요. 그래서 고른게 이 붉고 모던하게 각진 스타일, 마치 윈도우8의 시작화면 같은느낌을 골랐네요. 몇 가지 아쉬운건 카테고리를 트리 구조형식을 원하는데, 나중에 코드를 수정하던가 아예 바꾸던가 해야되겠죠?


저위에 백업/복원 눌러서 xml파일 업로드하면 알아서 내가 원하는데로 해주더라고요. 편리해요. 아 무료템플릿은 구글링하면 꽤나와요. 키워드는 무료 블로그 템플릿 하니깐  
btemplates.com/‎ 

여기 나오더라고요 블로거에 맞는 템플릿이 제공되서 미리보기해서 고르기만 하면되네요. 이 사람들은 이거 기부해서 잘먹고 잘사는지 궁금하네요. 저 정도로 기부할 재능만 있어도 좋겠다ㅏㅏㅏㅏㅏ.

간단한 블로그 시작기 끝.
블로그를 다시한번 시작!

블로그를 다시한번 시작!

블로그 시작!


저번에 블로그를 시작했는데 몇 개월 안가서 접었네요. 뚜렷한 목적도 없었고 공유의 흥미도 없어서 그랬어요. 이번에는 목적! 내 학습들을 기록하고 나중에도 찾아볼 수 있게 정리해 놓고 뭐 그거를 가져다 써주는 사람은 땡큐라고 생각해요. 모든 글은 한글로 올릴 거고 쉽게 쉽게 쓸려고 노력할 거에요. 지금 하고 있는 것 중에 몇 가지가 이미 진행된게 있어서 중간부터 시작하는 것도 있을 거에요. 그런 것들은 우선 어쩔 수 없고 지금부터 진행되는 건 모두 적어 놓을게요.

우선 첫번째, Node.js를 하던 참이었어요. 나름 아이디어도 생기고 자바스크립트라는 매력적인 언어를 기반으로해서 작성할 수도 있고 지금 상태는 쉬운 예제들을 갓 끝낸 상태에요.

그리고 두번째, opencv 이건 지금 처음 건들여 보는 거에요. 교수님의 과제로 이걸지금 건드려봐야되요. 책의 목차를 보니 중요한 영상처리에 중요한 알고리즘 혹은 기계러닝 라이브러리를 제공해주고 있어요. 아 기대되네요~ 오랜만에 C를 만져봐야될 거같아 한숨 나오지만.....씨는 진짜 씨x에 씨인거 같에요.

아 그리고 이번엔 블로그 좀 오래해볼려고 여기 템플릿도 바꾸고 해봤어요. 좋은 템플릿이 무료로 많이 배포되네요. 그런 재능을 가지고 있고 또 공유를 하는 사람들... 부럽네요.