본문 바로가기
연구관련/Bioinfo류

기계학습 관련 글 예고(?), ㅋ

by adnoctum 2013. 9. 29.




   다음과 같은 기계 학습 (machine learning) 관련 library 들에 관해 글을 차근차근 쓸 예정이다. 



위 라이브러리는 많은 예제가 있고 대부분 상업용 제품에 사용될 때에도 자유롭게 쓸 수 있는 라이브러리이다. python 의 scikit learn 은 많은 예제가 제공되고 있으므로 예제 페이지의 코드를 살펴 보는 것만으로도 어느 정도 사용법을 익힐 수 있다. dlib c++ 은 기계 학습 뿐만 아니라 다른 것도 제공이 되고 문서화가 잘 되어 있기는 한데 예제에 관한 결과 그림이 없어서 약간 불편하긴 하지만 실험 정신이 약간만 있어도 쉽게 이용할 수 있다. 특히 이들 라이브러리는 설치에 크게 힘이 들지 않다. dlib C++ 의 경우 주로 file 을 include 하는 식으로 사용할 수 있고, scikit learn 은, 파이썬의 여타 라이브러리와 같이 설치가 매우 쉽다. 둘 모두 linux 와 windows 에서 사용할 수 있다 - 난 둘 모두 linux/windows 에서 사용해 봤다. 


machine learning 의 주요 기능 중 하나는 예측 (prediction) 이다. 즉, 입력으로 주어진 data group 에 내포된 패턴을 추출 (training) 하여 이를 기반으로 새로 주어진 데이터가 어느 group 에 속하는지를 예측하는 것이다. 쉽게 몇 가지 예를 들면, 


+ 질병과 정상인의 유전자 발현 정도를 이용하여 각 그룹에 속한 발현 패턴을 추출해 낸 후, 새로운 사람의 유전자 발현 정도를 이용하여 그 사람이 질병이 있는지 없는지를 예측한다. 

+ 한 달 간의 주가 등록의 패턴을 이용하여 앞으로 1주일간 주가가 움직일 범위를 확률적으로 예측한다. 

+ 신용불량자와 그렇지 않은 사람의 신용카드 사용 패턴을 분석하여 고객이 앞으로 1년 안에 신용불량자가 될 확률을 구한다. 


등등이 있다. 많은 경우 "될 것이다"에 대한 확률을 구하는 식으로 작용한다. 패턴을 찾아 내는 방법 중에 널리 이용되는 것들은 support vector machine (SVM), SVM의 일종의 확장 버전인 relevance vector machine (RVM), 변수의 선형 결합을 최적화시켜 환자군의 그룹을 가장 잘 나누게 하는 Fisher's discriminant analysis (FDA), 관찰된 변수의 변화에 숨어 있는 상태 변화를 추정하여 앞으로의 변화를 예측하는 Hidden Markov Model (HMM), 등등이 있다. 


개별 library 들은, 찾아 보면 꽤 많은 것들이 있다. 특히 행렬 연산이 위 방법들 뿐만 아니라 일반적인 경우에도 많이 이용되기 때문에 위 라이브러리에서도 기본적으로 제공이 되긴 하는데 별도의 많은 matrix 연산 라이브러리들이 있다. 예를 들면 TNT Library, Intel 의 Math Kernel Library 등등이다. Intel 의 MKL 은 상용인데 linux의 연구용은 비상용인 것으로 알고 있다. 또한 다른 많은 분야에서 기계 학습이 사용되기 때문에 다른 라이브러리에서도 몇 가지 기본적인 기계 학습 루틴을 제공한다. 예를 들면, 비상업용 영상 처리 라이브러리인 OpenCV[각주:1] 에도 몇 가지 기계 학습 루틴과 matrix 연산 루틴이 제공된다. 어느 게 더 좋다, 라고 말하긴 좀 그렇고, 우리는 자신의 목적을 이룰 수 있는 library 가 있으면 구분 없이 가져다 쓰면 그만이다, ㅋ, 언어든 운영쳬제든 뭐든[각주:2]


   요즘 회사에서 일을 하느라 라이센스에 좀 민감한데, GPL 의 경우 연구용일 때는 편한데, 상업용이면 조금 애매하다. LGPL 이나 Boost License 면 상업용으로 사용해도 무리가 없어 보인다. dlib C++ 이 Boost License 이고, scikit learn 은 BSD 이고, 상업용으로 사용할 수 있다고 한다.







  1. OpenCV 역시 상업용 제품에 사용할 수 있고 linux 에서도 사용할 수 있다. 단지, 설치하기 위해선 약간의 노력이 필요하다. [본문으로]
  2. 리눅스, 윈도우즈에 구분 없고, C++/Python/Delphi/Perl/R/Java 등, 구분이 없는 게 좋다. 왜냐 하면, 한 언어로 쉽게 할 수 있는 일이 다른 언어로 어려운 경우가 종종 있기 때문이다. [본문으로]