Support Vector Machine

advertisement
Support Vector Machine
Классификация данных методом опорных
векторов
http://habrahabr.ru/post/105220/
Добрый день!
В данной статье я хочу рассказать о проблеме классификации данных
методом опорных векторов (Support Vector Machine, SVM). Такая
классификация имеет довольно широкое применение: от распознавания
образов или создания спам-фильтров до вычисления распределения горячих
алюминиевых частиц в ракетных выхлопах.
Сначала несколько слов об исходной задаче. Задача классификации состоит в
определении к какому классу из, как минимум, двух изначально известных
относится данный объект. Обычно таким объектом является вектор в nмерном вещественном пространстве . Координаты вектора описывают
отдельные атрибуты объекта. Например, цвет c, заданный в модели RGB,
является вектором в трехмерном пространстве: c=(red, green, blue).
Если классов всего два («спам / не спам», «давать кредит / не давать
кредит», «красное / черное»), то задача называется бинарной
классификацией. Если классов несколько — многоклассовая
(мультиклассовая) классификация. Также могут иметься образцы каждого
класса — объекты, про которые заранее известно к какому классу они
принадлежат. Такие задачи называют обучением с учителем, а известные
данные называются обучающей выборкой. (Примечание: если классы
изначально не заданы, то перед нами задача кластеризации.)
Метод опорных векторов, рассматриваемый в данной статье, относится к
обучению с учителем.
Итак, математическая формулировка задачи классификации такова: пусть X
— пространство объектов (например, ), Y — наши классы (например, Y = {1,1}). Дана обучающая выборка:
. Требуется построить
функцию
объекту x.
(классификатор), сопоставляющий класс y произвольному
Метод опорных векторов
Данный метод изначально относится к бинарным классификаторам, хотя
существуют способы заставить его работать и для задач
мультиклассификации.
Идея метода
Идею метода удобно проиллюстрировать на следующем простом примере:
даны точки на плоскости, разбитые на два класса (рис. 1). Проведем линию,
разделяющую эти два класса (красная линия на рис. 1). Далее, все новые
точки (не из обучающей выборки) автоматически классифицируются
следующим образом:
точка выше прямой попадает в класс A,
точка ниже прямой — в класс B.
Такую прямую назовем разделяющей прямой. Однако, в пространствах
высоких размерностей прямая уже не будет разделять наши классы, так как
понятие «ниже прямой» или «выше прямой» теряет всякий смысл. Поэтому
вместо прямых необходимо рассматривать гиперплоскости — пространства,
размерность которых на единицу меньше, чем размерность исходного
пространства. В , например, гиперплоскость — это обычная двумерная
плоскость.
В нашем примере существует несколько прямых, разделяющих два класса
(рис. 2):
С точки зрения точности классификации лучше всего выбрать прямую,
расстояние от которой до каждого класса максимально. Другими словами,
выберем ту прямую, которая разделяет классы наилучшим образом (красная
прямая на рис.2). Такая прямая, а в общем случае — гиперплоскость,
называется оптимальной разделяющей гиперплоскостью.
Вектора, лежащие ближе всех к разделяющей гиперплоскости, называются
опорными векторами (support vectors). На рисунке 2 они помечены
красным.
Немного математики
Пусть имеется обучающая выборка:
.
Метод опорных векторов строит классифицирующую функцию F в виде
,
где
— скалярное произведение, w — нормальный вектор к разделяющей
гиперплоскости, b — вспомогательный параметр. Те объекты, для которых
F(x) = 1 попадают в один класс, а объекты с F(x) = -1 — в другой. Выбор
именно такой функции неслучаен: любая гиперплоскость может быть задана
в виде
для некоторых w и b.
Далее, мы хотим выбрать такие w и b которые максимизируют расстояние до
каждого класса. Можно подсчитать, что данное расстояние равно
.
Проблема нахождения максимума
эквивалентна проблеме нахождения
минимума
. Запишем все это в виде задачи оптимизации:
которая является стандартной задачей квадратичного программирования и
решается с помощью множителей Лагранжа. Описание данного метода
можно найти в Википедии.
Линейная неразделимость
На практике случаи, когда данные можно разделить гиперплоскостью, или,
как еще говорят, линейно, довольно редки. Пример линейной
неразделимости можно видеть на рисунке 3:
В этом случае поступают так: все элементы обучающей выборки
вкладываются в пространство X более высокой размерности с помощью
специального отображения
. При этом отображение выбирается
так, чтобы в новом пространстве X выборка была линейно разделима.
Классифицирующая функция F принимает вид
.
Выражение
называется ядром классификатора. С
математической точки зрения ядром может служить любая положительно
определенная симметричная функция двух переменных. Положительная
определенность необходимо для того, чтобы соответствующая функция
Лагранжа в задаче оптимизации была ограничена снизу, т.е. задача
оптимизации была бы корректно определена.
Точность классификатора зависит, в частности, от выбора ядра. На видео
можно увидеть иллюстрацию классификации при помощи полиномиального
ядра:
Чаще всего на практике встречаются следующие ядра:
Полиномиальное:
Радиальная базисная функция:
Гауссова радиальная базисная функция:
Сигмоид:
ПРИМЕР
Сгенерируем данные такого вида:
1
2
3
4
5
6
7
8
9
10
11
a
55
14
97
88
72
38
95
82
3
98
95
b
c
9
ЛОЖЬ
62
ЛОЖЬ
75
ЛОЖЬ
86
ЛОЖЬ
57 ИСТИНА
89
ЛОЖЬ
89
ЛОЖЬ
48
ЛОЖЬ
22
ЛОЖЬ
63
ЛОЖЬ
78
ЛОЖЬ
34
35
36
37
38
39
40
41
42
43
44
45
59
99
18
40
86
87
55
57
23
39
52
69
31
6
67
49
22
73
55
58
3
25
89
6
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ИСТИНА
ИСТИНА
ЛОЖЬ
ИСТИНА
ЛОЖЬ
ЛОЖЬ
68
69
70
71
72
73
74
75
76
77
78
79
10
59
100
28
98
26
38
15
32
81
92
38
43
ЛОЖЬ
14
ЛОЖЬ
9
ЛОЖЬ
92
ЛОЖЬ
4
ЛОЖЬ
42 ИСТИНА
99
ЛОЖЬ
30
ЛОЖЬ
83
ЛОЖЬ
77
ЛОЖЬ
11
ЛОЖЬ
82
ЛОЖЬ
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
92
89
34
29
77
55
20
87
59
38
90
93
28
13
77
90
37
74
3
12
36
39
7
78
13
68
40
87
30
38
84
44
95
34
15
16
67
62
30
24
99
64
4
10
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ИСТИНА
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
38
94
24
60
79
15
60
42
69
1
11
43
41
98
45
82
55
74
76
30
48
79
95
56
57
36
27
73
18
60
44
64
46
67
34
29
81
7
26
26
35
1
94
11
ЛОЖЬ
ЛОЖЬ
ИСТИНА
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ИСТИНА
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ИСТИНА
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
81
22
11
91
73
94
84
30
48
6
85
85
0
21
23
5
25
96
12
92
46
9
42
77
79
35
57
57
44
4
87
9
0
75
42
12
46
67
79
99
90
65
ЛОЖЬ
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
ИСТИНА
>
db=read.table("D:/KEK/DataMining/R/данные/SVM.csv",head
er=TRUE,sep=";")
> attach(db)
Логистическая регрессия на таких данных не работает. Проверьте!
>
>
>
>
>
library(e1071)
x <- subset(db, select = -c)
y <- c
model <- svm(x, y)
summary(model)
Call:
svm.default(x = x, y = y)
Parameters:
SVM-Type:
SVM-Kernel:
cost:
gamma:
C-classification
radial
1
0.5
Number of Support Vectors:
( 18 16 )
Number of Classes:
2
34
Levels:
ИСТИНА ЛОЖЬ
> pred <- predict(model, x)
> table(pred, y)
y
pred
ИСТИНА ЛОЖЬ
ИСТИНА
19
0
ЛОЖЬ
3
78
> z=data.frame(db,pred)
> z
a b
c
pred
1
55 9
ЛОЖЬ
ЛОЖЬ
2
14 62
ЛОЖЬ
ЛОЖЬ
3
97 75
ЛОЖЬ
ЛОЖЬ
4
88 86
ЛОЖЬ
ЛОЖЬ
5
72 57 ИСТИНА ИСТИНА
6
38 89
ЛОЖЬ
ЛОЖЬ
7
95 89
ЛОЖЬ
ЛОЖЬ
8
82 48
ЛОЖЬ
ЛОЖЬ
9
3 22
ЛОЖЬ
ЛОЖЬ
10
98 63
ЛОЖЬ
ЛОЖЬ
...
> plot(b,a, bg=c("red","green")[c], pch=c(21,22)[pred])
Download