Istnieją co najmniej dwa sposoby motywowania SVM, ale wybiorę tutaj prostszą drogę.
Teraz zapomnij na chwilę o wszystkim, co wiesz o SVM i skup się na problemie. Otrzymujesz zestaw punktów wraz z niektórymi etykietami ( yD={(xi1,xi2,yi)} ), które pochodzą z { 1 , - 1 } . Teraz staramy się znaleźć linię w 2D, tak aby wszystkie punkty z etykietą 1 spadły na jedną stronę linii, a wszystkie punkty z etykietą - 1 spadły na drugą stronę.yi{1,−1}1−1
Przede wszystkim sobie sprawę, że jest linia 2d i w 0 + w 1 x 1 + w 2 x 2 > 0 oznacza "z jednej strony" linii i wagowo 0 + w 1 x 1 + w 2 x 2 < 0 oznacza „drugą stronę” linii.w0+w1x1+w2x2=0w0+w1x1+w2x2>0w0+w1x1+w2x2<0
Z powyższego możemy wywnioskować, że chcemy jakiegoś wektora takiego, że
w 0 + w 1 x i 1 + w 2 x i 2 ≥ 0 dla wszystkich punktów x i z y i = 1 oraz w 0 + w 1 x i 1 + w 2 x i 2 < 0[w0,w1,w2]w0+w1xi1+w2xi2≥0xiyi=1w0+w1xi1+w2xi2<0dla wszystkich punktów z Y i = - 1 [1].xiyi=−1
Załóżmy, że taka linia faktycznie istnieje, wtedy mogę zdefiniować klasyfikator w następujący sposób:
min|w0|+|w1|+|w2|subject to:w0+w1xi1+w2xi2≥0,∀xi with yi=1w0+w1xi1+w2xi2<0,∀xi with yi=−1
Użyłem powyżej dowolnej funkcji celu, w tej chwili nie obchodzi nas, która funkcja celu jest używana. Chcemy tylko które spełnia nasze ograniczenia. Ponieważ założyliśmy, że istnieje linia, dzięki której możemy oddzielić dwie klasy tą linią, znajdziemy rozwiązanie powyższego problemu optymalizacji.w
Powyższe nie jest SVM, ale da ci klasyfikator :-). Jednak ten klasyfikator może nie być bardzo dobry. Ale jak zdefiniować dobrego klasyfikatora? Dobry klasyfikator to zwykle taki, który dobrze spisuje się na zestawie testowym. Najlepiej, by przejść przez wszystkie możliwe , jakoby rozdzielić dane treningowe i zobaczyć, który z nich ma również na danych testowych. Są jednak nieskończone w , więc jest to całkiem beznadziejne. Zamiast tego rozważymy pewne heurystyki, aby zdefiniować dobry klasyfikator. Jedna heurystyka polega na tym, że linia oddzielająca dane będzie wystarczająco daleko od wszystkich punktów (tj. Zawsze będzie przerwa lub margines między punktami a linią). Najlepszy z nich to ten, który ma maksymalny margines. To jest wykorzystywane w SVM.ww
Zamiast nalegać, aby dla wszystkich punktów x i z y i = 1 oraz w 0 + w 1 x i 1 + w 2 x i 2 < 0 dla wszystkich punktów x i w 1 x i 1 + w 2 x i 2w0+w1xi1+w2xi2≥0xiyi=1w0+w1xi1+w2xi2<0xi z , jeżeli twierdzą, że w 0 +yi=−1 dla wszystkich punktów x I z Y i = 1 , a W 0 + w 1 x I 1 + w 2 x i 2 ≤ - 1 dla wszystkich punktów x I z Y i = - 1w0+w1xi1+w2xi2≥1xiyi=1w0+w1xi1+w2xi2≤−1xiyi=−1, to tak naprawdę nalegamy, aby punkty były daleko od linii. Margines geometryczny odpowiadający temu wymaganiu wynosi .1∥w∥2
Otrzymujemy następujący problem optymalizacji,
max1∥w∥2subject to:w0+w1xi1+w2xi2≥1,∀xi with yi=1w0+w1xi1+w2xi2≤−1,∀xi with yi=−1
Nieco zwięzłą formą pisania jest
Jest to w zasadzie podstawowy preparat SVM. Dla zwięzłości pominąłem sporo dyskusji. Mam nadzieję, że w dalszym ciągu udało mi się zrealizować większość tego pomysłu.
min∥w∥2subject to:yi(w0+w1xi1+w2xi2)≥1,∀i
Skrypt CVX, aby rozwiązać przykładowy problem:
A = [1 2 1; 3 2 1; 2 3 1; 3 3 1; 1 1 1; 2 0 1; 2 1 1; 3 1 1];
b = ones(8, 1);
y = [-1; -1; -1; -1; 1; 1; 1; 1];
Y = repmat(y, 1, 3);
cvx_begin
variable w(3)
minimize norm(w)
subject to
(Y.*A)*w >= b
cvx_end
Dodatek - marża geometryczna
wyi(w0+w1x1+w2x2)≥1yi(w0+wTx)≥1≥1
x+wTx++w0=1x−wTx−+w0=−1. Now, the distance between x+ and x− will be the shortest when x+−x− is perpendicular to the hyperplane.
Now, with all the above information we will try to find ∥x+−x−∥2 which is the geometric margin.
wTx++w0=1
wTx−+w0=−1
wT(x+−x−)=2
|wT(x+−x−)|=2
∥w∥2∥x+−x−∥2=2
∥x+−x−∥2=2∥w∥2
[1] It doesn't actually matter which side you choose for 1 and −1. You just have to stay consistent with whatever you choose.