3. 문제의 이해
숫자는 0에서 9까지 존재하고, 이를 컴퓨터에서는 일종의 데이터로 표현할
수 있다.
Ex) “2”(10) → 10(2)
“그림”으로 된 “숫자“가 있을 때, 컴퓨터가 숫자 “데이터”를 인식하는 방법
에 대해 고려해 보자.
분류기
2
그림 “2” 데이터 “2”
4. 그림 숫자 인식
그림으로 된 숫자
모양이 “정해진“
숫자
모양이
“정해지지 않은“
숫자
활자체 인식
필기체 인식
6. 활자체숫자인식
숫자의 모양이 정해져있음.
예) Helvetica체를 사용
크기와 회전정도를 같게 한다음에
일치하는지 대조
Helvetica체의
0에서 9까지의 숫자를 인식함
(10번의 비교 동작내의 인식가능)
2
0 1 2 3 4 5 6 7 8 9
7. 필기체숫자인식
“사람의 필기체는 „자획구성‟, „자획형태„, „필순„, „배자„, „필세„, „오자„, „오용‟등을 구분해
확연한 개성을 가지기 때문에 각 개인임을 분류 할 수 있습니다”
- 국립과학수사연구원 필적감정사 “한정수“ 수석연구원
8. 필기체숫자인식
1. 글자를 그리는 순서로 결정
> 왼손잡이, 오른손잡이의
경우에는
2. 획의 방향으로 결정
> 1의 경우 왼쪽, 오른쪽으로
내려 긋는 방향이 다름
3. 획의 개수로 결정
> 컴퓨터에서 획의 개수를
어떻게 구할수있을까?
한 획을 생략하는 경우에는?
4. 대략적인 모양의
일치 확률로 결정
9. 사용된 데이터
“대략적인 모양의 일치 확률로 구분한다는데, 그럼 수 없이 많은 숫자 모양
에 대한 정보가 필요하지 않나요?”
THE MNIST DATABASE of handwritten digits
약 6만개의 0부터 9까지의 각각 다른 개인별 필적에 대한 정보가 있음.
http://yann.lecun.com/exdb/mnist/
28x28 의 이미지 파일 형태와, 필기를 한 사람이 실제로 쓰려고 한 숫자 데
이터 정보로 구성됨
10. Naive Bayes classifier
사후확률은 사전확률과 우도들의 곱셈으로 구할 수 있음.
이 문제에서의 사전확률은?
“이 숫자가, 0부터 9중 하나일 확률“ -> 모든 경우들이 0.1로 동일
이 문제에서의 우도는? -> 우도(“클래스 조건 확률“)에 들어가는 조건은?
조건1)
픽셀이 흰색인 경우 0으로 나타냄
조건2)
픽셀이 검은색인 경우 1로 나타냄
11. Navie Bayes classifier - likelihood
0,2가 on일때 우도 = 0,2가 on일 때의 개수 / 전체 데이터의 개수
= 2 / 3 = 0.6666
12. Naive Bayes classifier
3의 경우를 예로들어,
{F0,0 = 0, F0,1 = 0, F0,2 = 1, …… ,
F8,8=0}
나이브 베이지안 모델
배열의 클래스 사후확률 =
사전확률 x 배열의 시작지점 0,0부터 끝지
점 8,8까지의 우도
0….9까지 사후확률을 구해 최대값으로
결정
16. 과적합 현상의 해결 방법
모든 우도에 아주 작은 임의 수를 더해 줄 경우, 사후확률이 0이 되는 경우를
방지할 수 있다. → 0만 피할 수 있을 뿐, 사후확률이 아주 낮아지는 문제에
대한 긍정적인 해답은 아님
우도들의 곱과, log10을 취한 우도들의 합으로 대신해서 나타낼 수 있다.
하지만, 과적합 현상은 “컴퓨터가 기존에 수집한 데이터"를 절대적으로 신
뢰하기에 인식기가 인식한 결과가 신뢰도가 낮거나 아예 일치 하지 않는 데
이터가 발생할 수 있음에 유념하여야 한다.
17. Pseudo code
Int bayesclassifier(input[][], likelihood[][][])
{
Int result[10];
For(I = 0; I < 10; i++)
{
Result[i] = 0.1;
For(j = 0; j < 28; j++)
For(k=0; k<28; k++)
{
if(input[j][k] == 0)
Result[i] *= likelihood[i][j][k];
else
Result[i] *= (1 – likelihood[i][j][k];
}
}
Int max = -999;
Int maxi = 0;
For(int I = 0; i < 10; I++)
{
if(max < result[i])
{
max = result[i];
maxi = I;
}
}
Return maxi;
}
Void likelihoodcalc(input[][][], label[])
{
Int numcnt[10];
Double likelihood[10][28][28];
For(I = 0; I < 10000; i++)
{
numcnt[label[i]]++;
For(j = 0; I < 28; j++)
For(k=0; k<28; k++)
if(input[i][j][k] == 1)
likelihood[label[i]][j][k]++;
}
For(I = 0; I < 10; i++)
{
For(j = 0; j < 28; j++)
For(k = 0; k < 28; k++)
likelihood[i][j][k] = likelihood[i][j][k] /
numcnt[i];
}
}