바이오인포매틱스

베이즈 정리를 정리하고 넘어가자

hongiiv 2014. 3. 26. 19:51
반응형
바로전에 포스팅한 variant calling에 대한 것에 후속으로 somatic mutation에 대한 내용을 정리하고 있다. 살짝 귀뜸해주면 VarScan이라는 툴에 대한 논문을 보려다가 "Virmid: accurate detection of somatic mutations with sample impurity inference"라는 논문으로 급선회했고 virmid는 간단히 cancer 분석에서 contol sample이 mixed된 disease sample에 대해서 control sample이 어느정도의 proportion을 차지하는지를 estimate하여 이것을 somatuc mutation을 calling하는데 사용하는 논문이다.

뭐 그거 그렇고,  바로 snp/genotype/somtic mutation calling에서 가장 중요한 역할을 하는 것이 바로 베이즈의 정리이고 이것에 대한 이해가 선행되어야 한다. 그래서 했다. 국내 번역본으로는 "집단지성프로그래밍"이라는 책에 바로 베이즈의 정리에 대한 내용이 나오는데 오늘은 genome data가 아닌 스팸데이터를 통해 베이즈의 정리가 무엇인지 한번 살펴보려고 한다. 벌써 번역서가 나온지도 08년도이니 6년이나 지난 책이 되어 버렸고 이책이 나에게 좀 더 친근하게 다가온것은 원저자가 생명공학회사에서 약제 발현 원리를 이해하기 위한 알고리즘 개발과 데이터 마이닝을 했던 사람이라 더욱 특별했다.

집단지성프로그래밍
카테고리 컴퓨터/IT > 프로그래밍/언어
지은이 토비 세가란 (한빛미디어, 2008년)
상세보기

우선 우리는 분류기에 대해서 알아볼 것이다. 이 이메일이 스팸인지 아닌지? 특정부분의 genotype이 AA, AB, BB인지?와 같은 분류 말이다. 분류를 하기 위해서는 우선 훈련을 시켜야 한다. 이미 스팸 또는 정상의 이메일을 가지고 훈련을 시킬 것이고 이 훈련은 고되지만 훈련량이 많을 수록 즉, 이미 분류된 문서가 많을 수록 추후 이 분류기가 올바르게 판단할 가능성이 높아진다.

우선 feature들이 각 분류에서 얼마나 나타나는지를 확인할 것이다. 예를 들자면, {'quick':{'bad':0, 'good':2}, 'the': {'bad':3, 'good':3}}과 같이 각 단어(feature)가 두개의 good, bad라는 분류에 얼마나 나타나는지를 feature count(fc)를 한다. 

그럼 이제 특정 분류에 특정 단어가 나타날 확률을 계산할 수 있다. Pr(단어 | 분류)라는 조건부 확률, 예를 들어 "Good으로 분류된 문서가 단어 quick을 가질 기회"인 Pr(quick | good)은 good이라는 문서에 quick이라는 단어가 나타난 횟수를 good이라는 분류에 있는 전체 문서 개수로 나눈 값이 된다. 이 값이 0.666이라면 2/3만큼의 기회가 있다는 것을 의미한다.

지금까지는 Pr(Word | Category), 즉 특정 카테고리에 대해  특정 Word가 나타날 확률만을 알고 있는데, 우리는 특정 단어를 분류하려는 것이 아니라 하나의 문서를 분류하려고 하는 것이다. 즉, Pr(Document | Categroy)를 알고 싶은 것이다. 그렇다면 우리는 간단히 문서내의 모든 단어들의 확률을 곱하여 알 수 있다.

특정 분류에 대해 문서가 속할 확률 (Pr(Document | Categroy)) 을 알아내었다. 하지만 우리가 하려고 하는 것은 특정 문서가 있을때 이것을 각각 어떻게 분류할지에 대한 확률을 알고 싶은거다. 즉 Pr(Category | Document)를 알아야 하는거고 그래야 스팸 필터기를 만들 수 있는 것이다.

젠장 뭔지는 모르겠지만 feature를 뽑아서 이리저리해서 "good으로 분류된 문서가 특정 단어들로 구성된 문서를 가질 기회"를 구했는데, 정작 필요한 것은 "특정 단어들로 구성된 문서가  good에 속할 확률"이라니... 자 이렇듯 조건부 확률을 부침개 뒤집듯 확 뒤집어야 하는 상황이 된 것이다. 그럼 뒤집자! 어차피 이 뒤집기는 250년전 영국의 수학자 토마스 베이즈가 해결했다.

Pr(A | B) =  Pr (B | A) * Pr(A) / Pr(B)로 일반적으로 표현하며 이는 Pr(Category | Document) = Pr(Document | Categroy) * Pr(Category) / Pr(Document)로 표현할 수 있다. 우리는 Pr(Category) 즉, 무작위로 선택한 문서가 이 분류에 속할 확률을 알아야 하는데 이건 분류내 문서 건수를 전체 건수로 나누면 되고 Pr(Document)는 생략,,,

마찬가지로 genotype/snp call에서도 문서(Documnet) 대신 "특정 site의 read정보들"을 사용하고 category (good/bad) 대신 "AA, AB, BB"냐의 genotype을 사용하는 것이 다를 뿐 기본적인 베이즈의 정리를 따른다.

우리가 스팸필터기의 성능을 높이기 위해서는 feature로 뽑힌 단어를 단순히 단어들만이 아닌 대소문자를 인식한 단어, 단어와 단어의 조합인 구나 절을 사용하여 성능을 높일 수 있듯이 genoytpe/snp call에서도 Pr(B | A) 즉, 흔히 말하는 genotype likelihood를 정교하고 세련되게 만듦으로서 genotyping의 성능?을 높일 수가 있다. 바로 이부분이 앞으로 챌린징이 가능한 부분이다.

다소 생략된 느낌이 있다면 책사서 보길 바람요. 일반적인 데이터 대신  genome 데이터를 가지고 이런 입문서 만들면 재미있을듯한데... 팔리려나??

반응형