이번 시간에는 가장 유명하고 많이 사용되고있는 SVM 알고리즘에 대해 알아본다.
서포트 벡터 머신 ( SVM : Support Vector Machine ) 알고리즘이란?
- 기본적으로 두 개의 그룹 ( 데이터 ) 을 분리하는 방법으로 데이터들과 거리가 가장 먼 초평면 ( hyperplane ) 을 선택하여
분리하는 방법 ( maximum argin classifier )
위 2개의 그룹을 분리하기 위한 직선, 즉 선형적인 직선의 형태를 만든다.
1번과 2번의 직선을 보면 2개 직선 모두 두개의 그룹을 확실하게 나눴다고 하기에는 애매한 부분이 눈에 보인다.
그럼 사각형 그룹이나 삼각형 그룹에서 노이즈가 발생하게 됐을때 1번과 2번의 직선을 사용해서 구분하기는 어렵다.
그랬을때 두 그룹을 구분하기 위해서는 직관적이지만 간단하게 생각해보면 쉬운 직선을 그어 구분할 수 있다.
빨간색 삼각형에서 직선에 내린 수선의 길이와 파란색 사각형에서 직선에 내린 수선의 길이의 최소값이
가장 최대가 되게 만드는 직선을 구분선 즉, 초평면이라고 볼 수 있다.
이와같은 방법으로 마진이 가장 넓어질 수 있도록 그룹을 구분하는 방법을 SVM 알고리즘이라고 한다.
최대마진 초평면 구하기
수식을 모두 적을 수 없어 강의 자료를 그대로 캡쳐해서 참고한다.
초평면 식을 보면 직선의 방정식인 것을 알 수 있는데 직선의 일반방정식에 해당 좌표들을 대입하여 만들어진 식이다.
W X를 보면 진하게 쓰여져있는데 이는 벡터를 의미한다.
위 How to solve? 와 The solution 등의 설명은 이해하기 어려워 생략하지만
결국 우리가 알아야하는 점은
SVM이라는 알고리즘은 사각형과 삼각형의 데이터의 좌표 ( 위치 )를 주고 데이터의 레이블을 주게되면
해당 그룹들을 가장 잘 분리해주는 초평면 계산을 알아서 해준다는 것이다.
오분류 에러 허용하기
- 주어진 샘플을 완벽하게 두 개의 그룹으로 선형 분리할 수 없을 경우, 오분류 에러를 허용 ( Soft margin, C-SVM )
위 이미지와 같이 삼각형하나가 사각형 그룹 범위내에 있게되면 두개의 그룹으로 선형 분리하기 힘든 경우가 나온다.
그래도 마진을 작게주고 분리하게되면 사각형과 삼각형사이에 수직선을 그어 분리할 수 있다.
그러면 아래와 같은 경우는 어떻게 분리해야할까?
이와 같은 경우들은 충분히 많이 나올 수 있기 때문에 SVM이 해당 사각형과 삼각형을 노이즈로
취급하고 분류해줬으면해서 실행된 연구에서 나온 알고리즘이 C-SVM 알고리즘이다.
위 설명을 보게되면 C값을 이용해서 초평면을 설정해 줄 수 있다고 나오는데
이 관련된 내용은 나중에 나올 소스코드를 보며 같이 설명한다.
비선형 데이터 분리하기
기본적으로 SVM 이라고 하는 알고리즘은 입력 데이터가 선형으로 분류가 가능해야 동작하는 알고리즘이다.
그런데 입력데이터가 선형으로 분리가 불가능할 경우에 입력데이터의 차원을 1,2개 차원 증가시킨 형태로 확장하면 선형으로 분리할 수 있는 가능성이 생긴다.
- SVM은 선형 분류 알고리즘 → BUT 실제 데이터는 비선형으로 분포할 수 있음
- 비선형 데이터의 차원을 확장하면 선형으로 분리 가능
예를들어 위 이미지를 보게되면 왼쪽 이미지에서는 삼각형과 사각형을 직선으로 나눌 수 없다.
이럴때 2차원의 좌표평면을 z축을 추가한 3차원 공간으로 차원을 한개 더한다.
그렇게 되면 사각형과 삼각형의 z축차이를 주게되어 초평면을 구할 수 있게된다.
하지만 위와같이 매핑함수를 그대로 사용하지는 않고 커널트릭을 사용하여 계산한다.
커널 트릭 ( Kernel Trick )
- 매핑 함수를 직접 사용하는 대신 SVM 초평면 계산에서 사용되는 벡터 내적 연산을 대체하는 비선형 커널 함수
( kernel function ) 을 정의하여 사용
주요 커널 함수
- 다항식 커널 ( Polynomial ) :K( Xi,Xj ) = ( Xi * Xj + 1) ^d
d : 변경할 차원 수
감마 값이 너무 크면 아래와 같이 너무 좁게 데이터를 분류할 수도 있고
감마 값이 너무 작으면 너무 대략적으로 표현할 수 있기때문에 적당한 값을 찾아서 입력해주어야한다.
그럼 SVM을 OpenCV에서 사용하는 방법에 대해서는 다음시간에 알아본다.
'Program > 머신러닝' 카테고리의 다른 글
[Open CV] 머신러닝 _ HOG+SVM 필기체 숫자 인식 (0) | 2022.07.11 |
---|---|
[Open CV] 머신러닝 _ OpenCV SVM 사용하기 (0) | 2022.07.10 |
[Open CV] 머신러닝 k 최근접 이웃 알고리즘 (0) | 2022.07.08 |
[Open CV] 머신러닝 k 최근접 이웃 알고리즘 (0) | 2022.07.07 |
[Open CV] 머신러닝 클래스 (0) | 2022.07.06 |