Werkplaats / De werkplaats
In jouw eigen tempo
← Klassieke machine learning
MODULE 03 · LES 12

Zoek ruimte tussen de klassen

Bereken marges en hinge loss en verken een kernel zonder een volledige SVM-solver te verbergen.

60 min3 checkpoints
DIT GA JE ONTDEKKEN
  • 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.

m=y(w·x+b)d=m‖w‖

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.

GOED GECLASSIFICEERD KAN TOCH TE DICHTBIJ ZIJNBekijk de ruimte rond de grens

w=(1,0), b=−grens. De stippellijnen liggen één eenheid van de grens. Cirkels zijn −1, vierkanten +1.

-3-2-0.50.523
Binnen marge / fout2Gemiddelde hinge0.167

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.

01
CHECKPOINTOnderscheid een score van een afstand

2. 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.

yzm = yzVerlies
1220
10.50.50.5
1−1−12

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.

ℓ=max(0,1−yz)
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.

02
CHECKPOINTStraf punten binnen de marge

3. 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.

K(a,b)=e−γ‖a−b‖2

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.

03
CHECKPOINTVergelijk voorbeelden zonder alle nieuwe features uit te schrijven

Wat 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.

Verder lezen & bronnen

Inhoud gecontroleerd op 2026-10-28.
DE VOLGENDE STAPLaat ieder voorbeeld een keer onbekend zijn
JOUW EXPERIMENT

Probeer het zelf

Python
main.py

Python start zodra jij code uitvoert.

UITVOER

Je uitvoer verschijnt hier.
Alles rekent in je eigen browser.

Jouw checkpoints0 / 3
01
Onderscheid een score van een afstand

Schrijf marges(x,y,w,b) als (functionele_marge,geometrische_marge), met ValueError voor nulnorm of ongelijke dimensies.

Een hint

Gebruik het inproduct voor de score en sqrt(sum(w_j²)) voor de norm.

02
Straf punten binnen de marge

Schrijf hinge(zs,ys) als gemiddeld hinge-verlies, met controle op niet-lege gelijke lijsten en labels −1/+1.

Een hint

Bereken per voorbeeld max(0,1-y*z).

03
Vergelijk voorbeelden zonder alle nieuwe features uit te schrijven

Schrijf rbf(a,b,gamma), met ValueError bij negatieve gamma of ongelijke dimensies.

Een hint

Bereken de gekwadrateerde afstand en gebruik math.exp.

Vastgelopen? Bekijk de voorbeeldoplossing
def marges(x,y,w,b):
    if len(x)!=len(w) or y not in (-1,1):
        raise ValueError("Ongeldige marge-invoer")
    norm=sum(v*v for v in w)**0.5
    if norm==0:
        raise ValueError("Nulnorm")
    functional=y*(sum(a*c for a,c in zip(x,w))+b)
    return functional,functional/norm

def hinge(zs,ys):
    if not zs or len(zs)!=len(ys) or any(y not in (-1,1) for y in ys):
        raise ValueError("Ongeldige scoreparen")
    return sum(max(0,1-y*z) for z,y in zip(zs,ys))/len(zs)

def rbf(a,b,gamma):
    import math
    if len(a)!=len(b) or gamma<0:
        raise ValueError("Ongeldige kernelinvoer")
    return math.exp(-gamma*sum((x-y)**2 for x,y in zip(a,b)))

Voer de code uit en verklaar voor jezelf waarom elke stap werkt.