{{위키데이터 속성 추적}}
{{기계 학습}}

[[파일:Svm max sep hyperplane with margin.png|섬네일|선형 SVM이 두 자료(흰색 원, 검은색 원)을 직선으로 분리하고 있다.]]

'''서포트 벡터 머신'''({{lang|en|support vector machine}}, '''SVM'''<ref name="CorinnaCortes"/><ref>*{{서적 인용|last1=Vapnik |first1=V. |year=2000 |title=The nature of statistical learning theory |publisher=Springer-Verlag New York |publication-place=New York |isbn=978-1-4419-3160-3 |chapter=Section 5.6. Support Vector Machines |chapter-url=https://books.google.co.kr/books?hl=ko&lr=&id=EqgACAAAQBAJ&oi=fnd&pg=PR7&dq=Vladimir+Vapnik&ots=g2M2my7U97&sig=ajdIjiyqwZfHe3608g-leQnWyMk#v=onepage&q=Vladimir%20Vapnik&f=false}}
</ref>)은 [[기계 학습]]의 분야 중 하나로 패턴 인식, 자료 분석을 위한 [[지도 학습]] 모델이며, 주로 [[분류]]와 [[회귀 분석]]을 위해 사용한다. 두 카테고리 중 어느 하나에 속한 데이터의 집합이 주어졌을 때, SVM 알고리즘은 주어진 데이터 집합을 바탕으로 하여 새로운 데이터가 어느 카테고리에 속할지 판단하는 비[[확률|확률적]] 이진 [[선형 분류]] 모델을 만든다. 만들어진 분류 모델은 데이터가 사상된 공간에서 경계로 표현되는데 SVM 알고리즘은 그 중 가장 큰 폭을 가진 경계를 찾는 알고리즘이다. SVM은 선형 분류와 더불어 비선형 분류에서도 사용될 수 있다. 비선형 분류를 하기 위해서 주어진 데이터를 고차원 특징 공간으로 사상하는 작업이 필요한데, 이를 효율적으로 하기 위해 [[커널 트릭]]을 사용하기도 한다.

<!--
'''서포트 벡터 머신'''({{lang|en|support vector machine}}, '''SVM''')은 [[지도 학습]]에서 사용되는 방법으로, 주어진 자료에 대해서 그 자료들을 분리하는 [[초평면]] 중에서, 자료들과 가장 거리가 먼 초평면을 찾는 방법이다.

== 정의 ==

일반적으로, 서포트 벡터 머신은 분류 또는 회귀 분석에 사용 가능한 [[초평면 (수학)|초평면]] 또는 초평면들의 집합으로 구성되어 있다. 직관적으로, 초평면이 가장 가까운 학습 데이터 점과 큰 차이를 가지고 있으면 분류 오차({{llang|en|classifier error}})가 작기 때문에 좋은 분류를 위해서는 어떤 분류된 점에 대해서 가장 가까운 학습 데이터와 가장 먼 거리를 가지는 초평면을 찾아야 한다.
일반적으로 초기의 문제가 유한 차원 공간에서 다루어지는데, 종종 데이터가 [[선형 구분 가능|선형 구분]]이 되지 않는 문제가 발생한다. 이러한 문제를 해결하기 위해 초기 문제의 유한 차원에서 더 높은 차원으로 대응시켜 분리를 쉽게 하는 방법이 제안되었다. 그 과정에서 계산량이 늘어나는 것을 막기 위해서, 각 문제에 적절한 [[커널 함수]] <math>k(x,y)</math>를 정의한 SVM 구조를 설계하여 [[점곱|내적 연산]]을 초기 문제의 변수들을 사용해서 효과적으로 계산할 수 있도록 한다.<ref>*{{서적 인용|last1=Press |first1=William H. |last2=Teukolsky |first2=Saul A. |last3=Vetterling |first3=William T. |last4=Flannery |first4=B. P. |year=2007 |title=Numerical Recipes: The Art of Scientific Computing |edition=3rd |publisher=Cambridge University Press |publication-place=New York |isbn=978-0-521-88068-8 |chapter=Section 16.5. Support Vector Machines |chapter-url=http://apps.nrbook.com/empanel/index.html#pg=883 }}
</ref>
높은 차원 공간의 초평면은 점들의 집합과 상수 벡터의 내적 연산으로 정의된다. 초평면에 정의된 벡터들은 데이터 베이스 안에 나타나는 이미지 벡터 매개 변수들과의 선형적 결합이 되도록 선택된다. 이 선택된 초평면에서, 초평면에 대응된 점 <math>x</math>는 다음과 같은 관계가 성립한다.
: <math>\textstyle\sum_i \alpha_i k(x_i,x) = \mathrm{constant}.</math>
만약 <math>k(x,y)</math>가 <math>x</math> 와 <math>y</math>가 점점 멀어질 수록 작아진다면, 각각의 합은 테스트 점 <math>x</math>와 그와 대응되는 데이터 점<math>x_i</math>의 근접성의 정도를 나타내게 된다. 이러한 방식으로, 위 커널식의 합은 구별하고 싶은 집합안에 있는 데이터 점과 테스트 점간의 상대적인 근접성을 측정하는데 사용될 수 있다. 초기 공간에서 볼록하지 않는 집합안의 점 <math>x</math>가 높은 차원으로 대응되었을 때 오히려 더 복잡하고 어려워질 수도 있는데 이런 부분을 주의해야 한다.

<!--
다음과 같은 데이터집합 D가 주어졌다고 생각해보자.
:<math>\mathcal{D} = \{ (\mathbf{x}_i, c_i)|\mathbf{x}_i \in \mathbb{R}^p, c_i \in \{-1,1\}\}_{i=1}^n</math>
''c''<sub>''i''</sub>는 1이나 -1의 값을 갖는 변수로 <math>\mathbf{x}_i </math>가 속한 클래스를 의미하며,
<math>\mathbf{x}_i </math>는 <math>p</math>차원 실수벡터이다.
[[파일:Svm separating hyperplanes.png|섬네일|right|H3은 두 클래스의 점들을 제대로 분류하고 있지 않다. H1과 H2는 두 클래스의 점들을 분류하는데, H2가 H1보다 더 큰 마진을 갖고 분류하는 것을 확인할 수 있다.]]
신경망을 포함하여 많은 학습 알고리즘들은, 이러한 학습데이터가 주어졌을 때 <math>c_i=1</math>인 점들과 <math>c_i=-1</math>인 점들을 분리하는 hyperplane을 찾아내는 것이 공통의 목표인데, SVM이 다른 알고리즘과 차별화되는 특징은 단지 점들을 분리하는 hyperplane을 찾는 것으로 끝나는 것이 아니라, 점들을 분리할 수 있는 수많은 후보평면들 가운데 마진이 최대가 되는(maximum-margin) hyperplane을 찾는다는 것이다. 여기서 margin이란 hyperplane으로부터 각 점들에 이르는 거리의 최솟값을 말하는데, 이 margin을 최대로 하면서 점들을 두 클래스로 분류하려면, 결국 클래스1에 속하는 점들과의 거리 중 최솟값과 클래스 -1에 속하는 점들과의 거리 중 최솟값이 같도록 hyperplane이 위치해야 하며, 이러한 hyperplane을 maximum-margin hyperplane이라고 한다. 결론적으로 SVM은 두 클래스에 속해있는 점들을 분류하는 수많은 hyperplane들 중, 최대한 두 클래스의 점들과 거리를 유지하는 것을 찾아내는 형락 알고리즘이라 할 수 있다.

=== 패턴 인식에 있어서의 학습 ===
패턴 인식을 실현하기 위해서는, 우선, 인식 대상으로부터 특징량을 계측(추출)할 필요가 있다.일반적으로는, 특징량은 1 종류 만이 아니고, 복수의 특징량을 계측해, 그것들을 동시에 이용하는 것이 많다. 그러한 특징량은, 통상, 정리해 특징 벡터

:<math>\mathbf{x}^T=(x_1,\ldots,x_M)</math>

로서 표현된다. 여기서,
:<math>\mathbf{x}^T</math>
는, 벡터
:<math>\mathbf{x}</math>
의 transpose를 나타낸다.
-->
== 목표 및 아이디어 ==
[[파일:Svm separating hyperplanes.png|섬네일|오른쪽|H3은 두 클래스의 점들을 제대로 분류하고 있지 않다. H1과 H2는 두 클래스의 점들을 분류하는데, H2가 H1보다 더 큰 마진을 갖고 분류하는 것을 확인할 수 있다.]]

데이터를 분류하는 것은 [[기계학습]]에 있어서 일반적인 작업이다. 주어진 데이터 점들이 두 개의 클래스 안에 각각 속해 있다고 가정했을 때, 새로운 데이터 점이 두 클래스 중 어느 곳에 속하는지 결정하는 것이 목표이다. 서포트 벡터 머신에서, 데이터 점이 <math>p</math>-차원의 벡터 (<math>p</math>개의 숫자 리스트)로 주어졌을 때, 이러한 데이터 점을 <math>(p-1)</math>-차원의 초평면으로 분류할 수 있는지를 확인하고 싶은 것이다.
이러한 작업을 선형 분류라고 말한다.
데이터를 분류하는 초평면은 여러 경우가 나올 수 있다. 초평면을 선택하는 타당한 방법 중 하나는 두 클래스 사이에서 가장 큰 분류 또는 마진(margin)을 가지는 초평면을 선택하는 것이다. 그래서 우리는 초평면에서 가장 가까운 각 클래스의 데이터 점들 간의 거리를 최대로 하는 초평면을 선택한다. 만약 그런 초평면이 존재할 경우, 그 초평면을 최대-마진 초평면({{llang|en|maximum-margin hyperplane}}) 이라 하고 선형 분류기를 최대-마진 분류기({{llang|en|maximum margin classifier}})라고 한다.

== 선형 SVM ==
주어진 학습용 데이터 집합 D(N 개의 점으로 이루어진 집합)를 다음과 같이 정의해보자.
:<math>\mathcal{D} = \{ (\mathbf{x}_i, y_i)|\mathbf{x}_i \in \mathbb{R}^p, y_i \in \{-1,1\}\}_{i=1}^n</math>

각 <math>\mathbf{x}_i</math>는 p차원의 실수 벡터이고 , <math>y_i</math>는 <math>\mathbf{x}_i</math> 가 어떤 클래스에 속해있는지를 나타내는 값으로 1 혹은 -1의 값을 가진다.

위의 학습용 데이터 집합이 <math>y_i</math>값에 따라 선형적으로 분리될 수 있을 때, 데이터 집합을 분리하는 것을 초평면이라 하며 다음의 조건을 만족하는 점 X의 집합으로 나타낼 수 있다.
: <math>\mathbf{w}\cdot\mathbf{x} - b=0.\,</math>
<math>\cdot</math> 은 [[내적]] 연산자이고, <math>{\mathbf{w}}</math>은 초평면의 [[법선 벡터]](normal vector)이다.

주어진 초평면의 서포트 벡터(<math>{\mathbf{X}}</math><sup>+</sup>, <math>{\mathbf{X}}</math><sup>-</sup>)는 다음과 같이 정의된다.
:<math>{\mathbf{X}}</math><sup>+</sup> : <math>y_i=+1</math>의 데이터중에서 초평면과 가장 가까운 데이터
:<math>{\mathbf{X}}</math><sup>-</sup> : <math>y_i=-1</math>의 데이터중에서 초평면과 가장 가까운 데이터

주어진 초평면과 같은 법선벡터를 가지면서 <math>{\mathbf{X}}</math><sup>+</sup>를 지나는 초평면은
:<math>\mathbf{w}\cdot\mathbf{x} - b=+1\,</math>
으로 나타낼 수 있고 비슷한 방식으로 <math>{\mathbf{X}}</math><sup>-</sup>를 지나는 초평면은
:<math>\mathbf{w}\cdot\mathbf{x} - b=-1\,</math>
이와 같이 나타낸다.

초평면의 마진은 각 서포트 벡터를 지나는 초평면 사이의 거리를 의미한다.
기하학적으로 두 초평면 사이의 거리 즉, 마진을 구하면 <math>\tfrac{2}{\|\mathbf{w}\|}</math>라는 것을 알 수 있으며 서포트벡터머신은 마진을 최대로 만드는 알고리즘이다.
<!--마진의 값이 최대인 초평면을 통해서 새로운 데이터가 속할 클래스 예측의 오차를 줄일 수 있다.-->

서포트벡터를 지나는 초평면 사이엔 데이터 포인트가 존재하지 않아야 하므로 다음과 같은 식이 성립한다.
:<math>y_i=+1</math>인 <math>\mathbf{x}_i</math> 에 대해서 <math>\mathbf{w}\cdot\mathbf{x}_i - b \ge+1\,</math>
:<math>y_i=-1</math>인 <math>\mathbf{x}_i</math> 에 대해서 <math>\mathbf{w}\cdot\mathbf{x}_i - b \le-1\,</math>

위 두 식은 아래와 같은 식으로 나타낼 수 있다.
:<math>y_i(\mathbf{w}\cdot\mathbf{x}_i - b) \ge 1,\text{ for all } 1 \le i \le n.</math>

초평면의 조건을 따르며 마진의 최댓값을 구하고자 하는 서포트 벡터 머신 문제는 다음과 같은 최적화 문제로 표현할 수 있다.
: <math>\arg\min_{(\mathbf{w},b)}\|\mathbf{w}\|</math>
:단, <math>y_i(\mathbf{w}\cdot\mathbf{x}_i - b) \ge 1,\text{ for all } 1 \le i \le n.</math>

=== 원 형식 ===
위에서 설명한 최적화 문제는 <math>\mathbf{w}</math>의 [[노름]]인 <math>\|\mathbf{w}\|</math>이 제곱근을 포함하고 있기 때문에 풀기 어렵다. 위의 최적화 문제에서 <math>\|\mathbf{w}\|</math>를 <math>\tfrac{1}{2}\|\mathbf{w}\|^2</math>로 치환하여도 최적화 문제를 만족시키는 해 <math>\mathbf{w}</math>, <math>b</math>는 변하지 않는다. 또한 <math>\tfrac{1}{2}\|\mathbf{w}\|^2</math>로 치환을 하게 되면 위의 문제는 2차 계획법({{llang|en|quadratic programming|쿼드라틱 프로그래밍}}) 최적화 문제가 된다. 치환된 최적화 문제는 아래와 같이 나타낼 수 있다.

: <math>\arg\min_{(\mathbf{w},b)}\frac{1}{2}\|\mathbf{w}\|^2</math>
:단, <math>y_i(\mathbf{w}\cdot\mathbf{x_i} - b) \ge 1,\text{ for all } 1 \le i \le n.</math>

[[라그랑주 승수법]]을 이용하면 위의 문제를 다음과 같은 [[안장점]]({{llang|en|saddle point}})을 찾는 문제로 나타낼 수 있다.
: <math>\arg\min_{\mathbf{w},b } \max_{\boldsymbol{\alpha}\geq 0 } \left\{ \frac{1}{2}\|\mathbf{w}\|^2 - \sum_{i=1}^{n}{\alpha_i[y_i(\mathbf{w}\cdot \mathbf{x_i} - b)-1]} \right\}</math>
안장점을 찾는 과정에서 <math>y_i(\mathbf{w}\cdot\mathbf{x_i} - b) - 1 > 0 </math>으로 분류될 수 있는 모든 점들은 그에 대응하는 <math>\alpha_i</math>가 0으로 지정되기 때문에 영향을 미치지 않는다.
이제 이 문제는 정규 2차 계획법 기법으로 해결할 수 있다. 정적 [[Karush-Kuhn-Tucker 조건]]에 따르면, 문제의 해는 훈련 벡터({{llang|en|training vector}})의 선형 조합으로 표현될 수 있다.
: <math>\mathbf{w} = \sum_{i=1}^n{\alpha_i y_i\mathbf{x_i}}</math>
적은 수의 <math>\alpha_i</math>만이 0보다 큰 값을 가지고, 그에 대응하는 <math>\mathbf{x_i}</math>들은 <math>y_i(\mathbf{w}\cdot\mathbf{x_i} - b) = 1</math>를 만족하는 정확한 서포트 벡터이다. 이 식을 통해 다음과 같이 [[오프셋 (컴퓨터 과학)]] <math>b</math>에 대한 정의를 유도할 수 있다.
: <math>\mathbf{w}\cdot\mathbf{x_i} - b = \frac{1}{y_i} = y_i \iff b = \mathbf{w}\cdot\mathbf{x_i} - y_i</math>
<math>b</math>는 <math>y_i</math>와 <math>x_i</math>에 의존하므로 각각의 데이터 포인트마다 값이 다르다. 표본 분포의 평균은 모평균(population mean)에 대해 [[불편 추정량]]이므로 다음과 같이 모든 서포트 벡터 <math>N_{SV}</math>에 대해서 평균을 취하는 것이 좋다.
: <math>b = \frac{1}{N_{SV}} \sum_{i=1}^{N_{SV}}{(\mathbf{w}\cdot\mathbf{x_i} - y_i)}</math>

=== 쌍대 형식 ===
분류 규칙을 비제약 쌍대 형식으로 나타내면, 최대 마진 초평면과 분류 작업이 오직 마진 위에 놓여있는 서포트 벡터들로부터만 영향을 받는다는 것을 알 수 있다. <math>\|\mathbf{w}\|^2 = \mathbf{w}^T\cdot \mathbf{w}</math>에서 <math>\mathbf{w} = \sum_{i=1}^n{\alpha_i y_i\mathbf{x_i}}</math>로 치환하면 SVM의 쌍대 형식이 다음과 같은 최적화 문제로 바뀐다.
:<math>\tilde{L}(\mathbf{\alpha})=\sum_{i=1}^n \alpha_i - \frac{1}{2}\sum_{i, j} \alpha_i \alpha_j y_i y_j \mathbf{x}_i^T \mathbf{x}_j=\sum_{i=1}^n \alpha_i - \frac{1}{2}\sum_{i, j} \alpha_i \alpha_j y_i y_j k(\mathbf{x}_i, \mathbf{x}_j)</math>를 최대화 하라.
:단, <math>\alpha_i \geq 0, ~~~\sum_{i=1}^n \alpha_i y_i = 0, ~~~\text{ for all } 1 \le i \le n.</math>

여기서 <math>\sum_{i=1}^n \alpha_i y_i = 0</math>는 <math>b</math>를 최소화하는 과정에서 생기는 제약이다.

커널은 <math>k(\mathbf{x}_i,\mathbf{x}_j)=\mathbf{x}_i\cdot\mathbf{x}_j</math>로 정의된다.

<math>\mathbf{w}</math>는 <math>\alpha</math> 항에 의해서 계산될 수 있다:

:<math>\mathbf{w} = \sum_i \alpha_i y_i \mathbf{x}_i.</math>

=== 편향된 초평면과 비편향된 초평면 ===
필요에 의해서 초평면이 좌표계의 원점을 지나야하는 경우가 존재한다. 이때 원점을 지나는 초평면을 비편향된 초평면이라 말하며, 그렇지 않은 초평면은 편향된 초평면이라 말한다. 원 형식에선 <math>b=0</math>의 조건을 줌으로써 비편향된 초평면을 구할 수 있고, 이에 대응되는 쌍대 형식은 위에서 제시된 쌍대 형식에서 <math> \sum_{i=1}^n \alpha_i y_i = 0</math>의 조건을 풀어줌으로써 구할 수 있다.

== 소프트 마진 ==
1995년에 Corinna Cortes와 Vladimir N. Vapnik은 잘못 분류된 자료들을 허용하는 변형된 최대 마진 분류기 아이디어를 제안했다.<ref name="CorinnaCortes">{{저널 인용
 | doi = 10.1007/BF00994018
| title = Support-vector networks
| journal = [[Machine Learning (journal)|Machine Learning]]
| volume = 20
| issue = 3
| pages = 273
| year = 1995
| last1 = Cortes | first1 = C. | authorlink1 = Corinna Cortes
| last2 = Vapnik | first2 = V.
}}</ref> 만약 “네” 또는 “아니오”라는 결과를 내야하는 자료들을 분할하는 초평면이 존재하지 않는다고 하자. 그러면 소프트 마진 방법은 여전히 가장 가까이 위치해 있는 제대로 분리되는 자료들의 거리를 최대화하면서, 주어진 자료들을 가능한 한 제대로 분리하는 초평면을 찾을 것이다. 이 방법은 음수가 아닌 느슨한 변수({{llang|en|slack variable}}) <math>\xi_i</math>를 이용하는데, 이 변수는 자료 <math>x_i</math>가 잘못 분류된 정도를 나타낸다.

: <math>y_i(\mathbf{w}\cdot\mathbf{x_i} - b) \ge 1 - \xi_i \quad 1 \le i \le n. \quad\quad(2)</math>

그러면 목적함수는 0이 아닌 <math>\xi_i</math>에 대해 페널티를 부과하는 함수에 의해서 증가된다. 그에 따른 최적화는 마진을 크게 하는 것과 에러에 대한 페널티를 작게 하는 것의 균형을 맞추는 것이 된다. 만약 페널티를 부과하는 함수가 선형이라면, 최적화 문제는 다음과 같이 된다.

: <math>\arg\min_{\mathbf{w},\mathbf{\xi}, b } \left\{\frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^n \xi_i \right\}</math>
: 단, <math> y_i(\mathbf{w}\cdot\mathbf{x_i} - b) \ge 1 - \xi_i, ~~~~\xi_i \ge 0, ~~~ \text{ for all } 1 \le i \le n.</math>

다변수 적응 회귀 스플라인({{llang|en|Multivariate Adaptive Regression Splines, MARS}})에서와 같이 경첩 함수({{llang|en|hinge function}}) 표기법을 이용하면, 이 최적화 문제는 다음과 같이 쓰일 수 있다.

: <math>[1-y_i(w \cdot x_i + b)]_+ = [\xi_i]_+ = \xi_i, \quad \lambda = 1/2C </math>일 때,
: <math> \sum_i [1-y_i(w \cdot x_i + b)]_+ + \lambda \|w\|^2</math>

(2)에서의 제약조건은 목적함수에서 <math>\|\mathbf{w}\|</math>를 최소화하는 것과 함께 [[라그랑주 승수법]]을 이용하여 위에서와 마찬가지로 해결될 수 있다. 그러면 다음의 문제를 해결해야 한다.

: <math>\arg\min_{\mathbf{w},\mathbf{\xi}, b } \max_{\boldsymbol{\alpha},\boldsymbol{\beta} }
\left \{ \frac{1}{2}\|\mathbf{w}\|^2
+C \sum_{i=1}^n \xi_i
- \sum_{i=1}^{n}{\alpha_i[y_i(\mathbf{w}\cdot \mathbf{x_i} - b) -1 + \xi_i]}
- \sum_{i=1}^{n} \beta_i \xi_i \right \}</math>
:단, <math> \alpha_i, \beta_i \ge 0</math>

[[파일:SVM with soft margin.pdf|섬네일|300px|소프트 마진 서포트 벡터 머신의 결과에 대한 예시]]

=== 듀얼 형식 ===
:<math>\tilde{L}(\mathbf{\alpha})=\sum_{i=1}^n \alpha_i - \frac{1}{2}\sum_{i, j} \alpha_i \alpha_j y_i y_j k(\mathbf{x}_i,\mathbf{x}_j)</math>를 최대화하라.
:단, <math>0 \leq \alpha_i \leq C,\,~~~\sum_{i=1}^n \alpha_i y_i = 0, ~~~\text{ for all } 1 \le i \le n.</math>

선형 페널티 함수의 핵심 장점은 상수 ''C''가 오직 라그랑주 승수법의 추가적인 제약조건에 등장함으로써, 듀얼 문제에서는 느슨한 변수가 사라진다는 점이다. 위의 공식화와 이것의 실제상황에서 미치는 큰 영향에 대해서 Cortes와 Vapnik은 2008년에 ACM Paris Kanellakis Award를 수상하였다.<ref>ACM Website, Press release of March 17th 2009. http://www.acm.org/press-room/news-releases/awards-08-groupa {{웨이백|url=http://www.acm.org/press-room/news-releases/awards-08-groupa# |date=20101230070415 }}</ref> 비선형 페널티 함수들도 특히 분류기에서 이상치({{llang|en|outliers}})의 효과를 줄이는데 사용되고 있다. 그러나 이를 사용하는데 주의를 기울이지 않는다면 문제는 볼록하지 않게({{llang|en|non-convex}}) 되고, 그러면 이는 전역해({{llang|en|global solution}})를 찾는데 상당히 어려운 문제가 된다.

== 비선형 분류 ==
[[파일:Kernel Machine.png|섬네일|커널 함수를 이용해서 구한 초평면]]
최적의 초평면을 구하는 알고리즘의 시초는 1963년도 vapnik이 제안한 선형 분류였다.
하지만 1992년에 Bernhard E. Boser, Isabelle M. Guyon and Vladimir N. Vapnik 이 최대 마진 초평면 문제에 커널 트릭을 적용해서 비선형 분류를 제안하였다.<ref>{{저널 인용|author=Aizerman, Mark A.; Braverman, Emmanuel M.; and Rozonoer, Lev I. |year=1964 |title=Theoretical foundations of the potential function method in pattern recognition learning |journal=Automation and Remote Control |volume=25 |pages=821–837 }}</ref><ref>{{서적 인용
 | doi = 10.1145/130385.130401
| chapter = A training algorithm for optimal margin classifiers
| title = Proceedings of the fifth annual workshop on Computational learning theory  - COLT '92
| pages = 144
| year = 1992
| last1 = Boser | first1 = B. E.
| last2 = Guyon | first2 = I. M.
| last3 = Vapnik | first3 = V. N.
| isbn = 089791497X
}}</ref> 비선형 분류 알고리즘은 기존의 선형 분류 알고리즘과 형태상으로 비슷하지만 내적 연산이 비선형 커널 함수로 대체된다. 이를 통해 변환된 특징 공간 (feature space)의 최대 마진 초평면 문제 해결을 할 수 있었다. 여기서 말하는 변환은 비선형 변환이거나 차원을 높이는 변환이 될 수 있다. 즉, 분류기는 고차원 특징 공간에서 선형 초평면이지만 기존 차원 공간 상에선 비선형 초평면이 된다. 만약 가우시안 방사 기저함수 (Gaussian radial basis function)를 커널 함수를 적용한다면 특징 공간은 무한 차원의 힐버트 공간(Hilbert space)이 된다.

최대 마진 분류는 많은 연구를 통해 조정되어왔다. 또한 고차원 공간을 이용한 분류는 기존 공간에서의 잘못된 분류 결과를 내지는 않을 것이라고 생각되어왔다. 하지만 고차원 공간에서의 분류는 기존 공간에서의 분류 일반화의 오차를 상승시킨다는 것이 증명되었고 그 상승 폭에 대한 임계 값이 있다는 것 역시 알려져 있다.<ref>{{콘퍼런스 인용|last1=Jin |first1=Chi |last2=Wang |first2=Liwei |title=Dimensionality dependent PAC-Bayes margin bound |conference=Advances in Neural Information Processing Systems |year=2012 | url=http://papers.nips.cc/paper/4500-dimensionality-dependent-pac-bayes-margin-bound}}</ref>


다음과 같은 일반적인 커널들이 있다.

* [[동차다항식]]({{llang|en|Homogeneous polynomial}}): <math>k(\mathbf{x_i},\mathbf{x_j})=(\mathbf{x_i} \cdot \mathbf{x_j})^d</math>
* 다항식 커널({{llang|en|Polynomial kernel}})(Inhomogeneous): <math>k(\mathbf{x_i},\mathbf{x_j})=(\mathbf{x_i} \cdot \mathbf{x_j} + 1)^d</math>
* 가우시안 방사 기저 함수({{llang|en|Gaussian radial basis function}}): <math>k(\mathbf{x_i},\mathbf{x_j})=\exp(-\gamma \|\mathbf{x_i} - \mathbf{x_j}\|^2)</math> <math>\text{for}</math> <math>\gamma > 0</math>. 때때로 <math>\gamma=1/{2 \sigma^2}</math>으로도 나타낸다.
* [[쌍곡선함수|쌍곡탄젠트]]({{llang|en|Hyperbolic tangent}}): <math>k(\mathbf{x_i},\mathbf{x_j})=\tanh(\kappa \mathbf{x_i} \cdot \mathbf{x_j}+c)</math>, <math>\text{for some (not every)}</math> <math>\kappa > 0 </math> <math>\text{and}</math> <math> c < 0 </math>

커널은 변환 <math>\varphi(\mathbf{x_i})</math>와 다음과 같이 연관되어 있다. <math>k(\mathbf{x_i}, \mathbf{x_j}) = \varphi(\mathbf{x_i})\cdot \varphi(\mathbf{x_j})</math>.

'''w'''의 값 또한 변환된 공간에 다음과 같이 존재한다. <math>\textstyle\mathbf{w} = \sum_i \alpha_i y_i \varphi(\mathbf{x}_i)</math>.

분류를 위해서 '''w'''와 내적을 구할 때는 다음과 같은 [[커널 트릭]]을 이용해 계산할 수 있다. <math>\textstyle \mathbf{w}\cdot\varphi(\mathbf{x}) = \sum_i \alpha_i y_i k(\mathbf{x}_i, \mathbf{x})</math>.

하지만, 일반적인 경우에 <math>\mathbf{w}\cdot\varphi(\mathbf{x}) = k(\mathbf{w'}, \mathbf{x})</math>를 만족하는 '''w''''는 존재하지 않는다.

== 적용 ==
SVM은 다음과 같은 현실 세계의 문제들을 해결하는데 사용된다:
* SVM은 텍스트와 하이퍼텍스트를 분류하는데 있어서, 학습 데이터를 상당히 줄일 수 있게 해준다.
* 이미지를 분류하는 작업에서 SVM을 사용할 수 있다. SVM이 기존의 쿼리 개량 구조보다 상당히 높은 검색 정확도를 보인 것에 대한 실험 결과가 있다.
* SVM은 분류된 화합물에서 단백질을 90%까지 구분하는 의학 분야에 유용하게 사용된다.
* SVM을 통해서 손글씨의 특징을 인지할 수 있다.

== 서포트 벡터 머신 라이브러리 ==
여러 프로그래밍 언어에 지원되는 서포트 벡터 머신 라이브러리 목록
=== C/C++ ===
* SVM light ( https://web.archive.org/web/20150419060655/http://svmlight.joachims.org/ )
: C로 구현된 서포트 벡터 머신 코드이다. 무료로 다운받아서 사용할 수 있으며, Windows, Mac OS X, Linux, Cygwin, 그리고 Solaris에서 사용 가능하다.
* mySVM ( https://web.archive.org/web/20150429131420/http://www-ai.cs.uni-dortmund.de/SOFTWARE/MYSVM/index.html )
: C로 구현된 서포트 벡터 머신 코드이다. SVM light를 최적화하는데 기반을 두고있다. 무료로 다운받아서 사용할 수 있으며, Windows와 Linux에서 사용 가능하다.
* LIBSVM.<ref name=" Chih-Chung Chang">{{저널 인용
 | doi = 10.1145/1961189.1961199
| title = LIBSVM: A library for support vector machines
| journal = [[Machine Learning (journal)|Machine Learning]]
| volume = 2
| issue = 3
| pages =
| year = 2011
| last1 = Chang| first1 = Chih-Chung
}}</ref> ( http://www.csie.ntu.edu.tw/~cjlin/libsvm/ )
: 파이썬에서의 LIBSVM과 같다.
* GPDT ( https://web.archive.org/web/20150419053847/http://dm.unife.it/gpdt/ )
: C++로 구현된 코드로, 이진 분류를 위한 큰 규모의 서포트 벡터 머신을 위해 설계된 코드이다. 무료로 다운받아서 사용할 수 있으며, Linux에서 사용 가능하다.

=== Python ===
* scikit-learn ( https://web.archive.org/web/20150418093915/http://scikit-learn.org/stable/index.html )
: 파이썬에서 머신 러닝 기법들을 사용하는데 도움을 주는 라이브러리이다. scikit-learn은 NumPy, SciPy, 그리고 matplotlib 라이브러리들을 기반으로 구현되었고 오픈 소스이며 상업적으로도 이용 가능하다. Windows, Mac OS X, 그리고 Linux에서 사용 가능하다.

* PyML ( https://web.archive.org/web/20150509071918/http://pyml.sourceforge.net/ )
: 파이썬에서 머신 러닝 기법들을 사용하는데 도움을 주는 라이브러리이다. 하지만 PyML은 scikit-learn이 전반적인 머신 러닝 기법들을 제공해주는데 비해, PyML은 서포트 벡터 머신 기능에 초점을 맞추고 있다. 무료로 다운받아서 사용할 수 있으며, Linux와 Mac OS X에서 사용 가능하다.

* LIBSVM ( http://www.csie.ntu.edu.tw/~cjlin/libsvm/ )
: 서포트 벡터 머신만을 위한 라이브러리로 파이썬 뿐만 아니라 C/C++, Java, Matlab, R, Perl 등의 다양한 언어를 지원한다. 무료로 다운받아서 사용할 수 있으며, Windows, Mac OS X, 그리고 Linux에서 사용 가능하다.

=== Java ===
* LIBSVM ( http://www.csie.ntu.edu.tw/~cjlin/libsvm/ )
: 파이썬에서의 LIBSVM과 같다.


=== MATLAB ===
* LIBSVM ( http://www.csie.ntu.edu.tw/~cjlin/libsvm/ )
: 파이썬에서의 LIBSVM과 같다.

* Matlab SVM Toolbox ( https://web.archive.org/web/20150421234040/http://www.isis.ecs.soton.ac.uk/resources/svminfo/ )
: 매트랩으로 구현한 서포트 벡터 머신이다. 서포트 벡터 머신을 이용한 분류와 회귀 기능을 제공하고 그래픽 사용자 인터페이스도 제공한다. 무료로 다운받아서 사용할 수 있다.

* Spider ( https://web.archive.org/web/20150416073847/http://people.kyb.tuebingen.mpg.de/spider/ )
: 매트랩에서 머신 러닝 기법을 사용하는데 도움을 주는 패키지이다. 무료로 다운받아서 사용할 수 있다.

* LS-SVMlab ( https://web.archive.org/web/20150513103825/http://www.esat.kuleuven.be/sista/lssvmlab/ )
: 기존의 표준적인 서포트 벡터 머신을 재공식화한 최소제곱법 서포트 벡터 머신을 구현한 매트랩 라이브러리이다. 무료로 다운받아서 사용할 수 있으며, Windows와 Linux에서 사용 가능하다..

* SVM Tools ( https://web.archive.org/web/20150309055649/http://research.cs.wisc.edu/dmi/svm/ )
: 매트랩으로 구현되었고, 다양한 버전의 서포트 벡터 머신을 지원한다. 무료로 다운받아서 사용할 수 있으며, 매트랩 파일 형식으로 제공된다.

=== R ===
* e1071( https://web.archive.org/web/20180714040902/http://cran.r-project.org/web/packages/e1071/e1071.pdf )
: 파이썬에서의 LIBSVM과 같다.
:
== 같이 보기 ==
* [[예측 분석]]
* [[순차적 최소 최적화]]
== 각주 ==
{{각주|30em}}

{{전거 통제}}

[[분류:기계 학습]]
[[분류:분류 알고리즘]]
[[분류:통계적 분류]]