3월부터 공부한 이산수학 개념들을 정리합니다. 교재는 Rosen의 이산수학 8판 입니다.

통계학과 이산 수학에서 자주 등장하는 조건부 확률과 베이즈 정리를 이용한 스팸(spam) 메일 필터 문제를 다루어 보겠습니다. 베이지안 스팸 필터란 특정 단어가 사용되었을 때 그 메일이 스팸 메일인지 아닌지를 구분하는 것을 의미합니다. 이런 구분을 위해 필요한 것은 스팸 메일을 받았을 때 해당 단어가 사용된 메일의 개수와 일반 메일을 받았을 때 해당 단어가 사용된 메일의 개수가 필요 합니다. 이 두 가지 정보를 가지고 특정 단어가 사용된 메일이 왔을 때 스팸인지 아닌지를 구분할 수 있습니다.

그렇다면 이 스팸 필터를 사용하면 모든 스팸 메일을 찾을 수 있을까요? 그렇지 않습니다. 필터의 성능은 100%가 아니기 때문에 오류의 가능성이 존재합니다. 오류에는 두 가지가 있습니다. 실제로 스팸 메일이지만 스팸 필터가 정상적인 메일로 판명하는 오류입니다. 이 오류의 이름은 2종 오류로 거짓 음성(False Negative)으로 부릅니다.스팸 메일을 정상으로 판정 했으면 그 반대의 경우도 존재합니다. 정상 메일을 스팸 메일로 판정하는 오류가 있습니다. 이 오류의 이름은 1종 오류로 거짓 양성(False Positive)으로 부릅니다. 이 오류 중 정상 메일을 스팸 메일로 잘 못 판정하는 경우가 더 치명적일 수 있기 때문에, 1종 오류를 최소화하는 것이 중요합니다.

어떤 단어가 사용되었을 때 스팸 메일일 경우의 확률은 다음과 같이 계산합니다. p(S)가 스팸메일인 사건 p(E)가 어떤 단어가 사용된 메일인 사건입니다. 스팸메일인 경우에 어떤 단어가 사용된 메일인 사건 나누기 어떤 단어가 사용된 사건(스팸메일인 경우에 어떤 단어가 사용된 메일인 사건+일반메일인 경우에 어떤 단어가 사용된 메일인 사건) 으로 구할 수 있습니다. 수식으로 보면 p(E|S)/(p(E|S)+p(E|S^C)) 이 됩니다.

문제 풀이

547쪽 예제 3: Rolex란 단어가 스팸메시지 2000개 가운데 250개 스팸이 아닌 메시지 1000개 가운데 5개 사용되었다고 하자. 수신된 메시지가 스팸일 확률과 아닐 확률이 서로 같다고 가정하고 수신된 메시지에 Rolex가 사용되었다면 스팸일 확률을 추정하라. 만일 스팸 판정 기준이 0.9라면 수신된 메시지를 스팸으로 거부해야 하는가?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
fn main() {
    let p = 250.0/2500.0;
    let q = 5.0/1000.0;
    println!("{:?}",conditional_prob(p,q));
    println!("{:?}",conditional_prob(p,q)>0.9);
    
}
fn conditional_prob(p:f32,q:f32) -> f32 {
    return p/(p+q)
}

풀이 결과

아래 코드를 실행한 결과 입니다. Rolex가 사용되었다면 스팸일 확률일 확률은 0.952로 0.9 보다 크기 때문에 수신된 메시지를 거부해야합니다.

1
2
0.95238096
true