- Je onderscheidt score, functionele marge en geometrische afstand.
- Je berekent hinge loss en een RBF-kernel en begrijpt hun rol in een SVM.
Twee spamfilters kiezen verschillende scheidingslijnen voor dezelfde berichten; bij de eerste liggen veel berichten vlak langs de grens. Een kleine verandering in hun features kan dan hun klasse omklappen. Een support vector machine (SVM) zoekt een scheiding met ruimte tussen de klassen, terwijl hij fouten kan toelaten wanneer de data niet netjes te scheiden zijn.
Je onderzoekt hier de bouwstenen: marges, hinge loss en een kernel. Een volledige SVM trainen vraagt ook een optimizer; die bouwen deze drie opdrachten niet. De genoemde voorkennis over inproducten en schalen helpt om de geometrie te begrijpen.
1. Meet aan welke kant een punt ligt
Een lineaire score is z = w·x+b. Voor deze methode coderen we de klassen als −1 en +1: vermenigvuldigen met y maakt de score positief wanneer het punt aan de juiste kant ligt. Deze functionele marge zegt iets over de classificatie, maar verandert wanneer je alle gewichten vergroot.
Neem x = [3,4], w = [3,4], b = −5 en y = +1. Het inproduct is 9+16 = 25, de score 20 en de functionele marge ook 20. De lengte van w is √25 = 5; delen door die lengte geeft de geometrische marge, hier 4.
d is de loodrechte afstand met een teken volgens het werkelijke label: negatief betekent de verkeerde kant. De norm gebruikt de kwadraten van alle componenten. Bij w = 0 bestaat geen bruikbare scheidingsrichting, dus weiger dat geval.
x = [3, 4]
y = 1
for w, b in [([3, 4], -5), ([6, 8], -10)]:
score = b
kwadraten = 0
for j in range(len(w)):
score = score + w[j] * x[j]
kwadraten = kwadraten + w[j] ** 2
m = y * score
d = m / kwadraten ** 0.5
print(m, d) # 20, 4; daarna 40, 4
Het verdubbelen van w én b verandert de grens en afstand niet; de functionele marge verdubbelt wel. Maak marges(x,y,w,b) als (m,d), met ValueError bij ongelijke dimensies, nulnorm of labels buiten −1/+1.
w=(1,0), b=−grens. De stippellijnen liggen één eenheid van de grens. Cirkels zijn −1, vierkanten +1.
Het diagram houdt w = [1,0] vast. Schuif de grens en zoek punten die nog correct liggen, maar binnen de stippellijnen vallen. De trainingspunten met een actieve bijdrage aan de geleerde grens heten support vectors; bij een gebruikelijke soft-margin SVM liggen ze op of binnen de marge.
012. Straf ook een correcte keuze die te dichtbij ligt
Hinge loss is nul wanneer de functionele marge minstens één is. Onder één groeit de straf lineair. Daardoor kan een correct geclassificeerd punt toch verlies hebben.
| y | z | m = yz | Verlies |
|---|---|---|---|
| 1 | 2 | 2 | 0 |
| 1 | 0.5 | 0.5 | 0.5 |
| 1 | −1 | −1 | 2 |
Het gemiddelde is (0+0.5+2)/3 = 5/6, ongeveer 0.833333. Het verkeerde punt krijgt de grootste straf; alleen correcte labels tellen zou het verschil tussen de eerste twee punten missen.
zs = [2, 0.5, -1]
ys = [1, 1, 1]
totaal = 0
for i in range(len(zs)):
verlies = max(0, 1 - ys[i] * zs[i])
totaal = totaal + verlies
print(totaal / len(zs)) # ongeveer 0.833333
Maak hinge(zs,ys) als gemiddeld verlies. Weiger lege of ongelijk lange lijsten en ongeldige labels. Veelgemaakte fout: absolute score gebruiken; dan raakt de informatie over de verkeerde kant verloren.
Een soft-margin SVM combineert een straf voor grote gewichten met hinge-verliezen. Een grotere C legt relatief meer nadruk op het beperken van die verliezen; een kleinere C laat daar meer ruimte voor tegenover de normstraf. De exacte schaal hangt af van de gebruikte som- of gemiddeldeconventie.
023. Vergelijk punten met een kernel
Een rechte grens past niet bij iedere dataset. Een kernel berekent overeenkomsten die een SVM kan gebruiken alsof hij in een andere featureruimte inproducten berekent. De RBF-kernel maakt nabijheid tot overeenkomst; de optimizer gebruikt die waarden vervolgens om te leren.
a en b zijn featurevectoren; gamma bepaalt hoe snel overeenkomst afneemt. Bij a = [0,0] en b = [1,2] is de gekwadrateerde afstand 1+4 = 5. Met gamma = 0.5 krijg je exp(−2.5), ongeveer 0.082085.
import math
a = [0, 0]
b = [1, 2]
afstand2 = 0
for j in range(len(a)):
afstand2 = afstand2 + (a[j] - b[j]) ** 2
gamma = 0.5
print(math.exp(-gamma * afstand2))
# ongeveer 0.082085
Gelijke punten geven één. Bij positieve gamma daalt de overeenkomst met afstand; gamma nul geeft overal één en maakt alle punten ononderscheidbaar. Maak rbf(a,b,gamma) en weiger negatieve gamma of ongelijke dimensies.
Schalen is hier belangrijk: een feature in duizenden kan de afstand overheersen. Leer de schaling uit training en kies gamma en C op validatie. Een grote gamma vergelijkt heel lokaal en kan daardoor trainingsdetails volgen.
03Wat neem je mee?
- Een marge gebruikt de score én het label; afstand vraagt daarnaast de norm van w.
- Hinge loss bestraft verkeerde punten en correcte punten binnen de functionele marge één.
- Een RBF-kernel vergelijkt alle componenten; schaling en gamma bepalen welke verschillen groot zijn.
Hierna kies je modellen en instellingen met herhaalde, eerlijke evaluatie.