Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.
In questa pagina 5
Testo. Nel piano sono dati quattro punti: classe −1: A=(1,1), B=(2,3); classe +1: C=(4,1), D=(5,4).
Si trovi l'iperpiano a margine massimo w⋅x+b=0 e si calcolino la larghezza del margine e i vettori di supporto.
Si ricavino i moltiplicatori αi della forma duale e si verifichi w=∑αiyixi.
Si classifichi il punto (2,5;2).
Si aggiunge il punto E=(3,3) di classe −1. Con (w,b) del punto 1 si calcolino la variabile di scarto ξE e il valore dell'obiettivo soft margin 21∥w∥2+C∑ξi. Si confronti poi con il piano w′=(1,2;−0,4), b′=−3,4: per quali C conviene il primo?
Idea. Tra due classi separabili, il piano a margine massimo ha due piani paralleli (w⋅x+b=±1) che toccano i vettori di supporto. Conviene cercare quali punti stanno sui due piani.
Passo 1: i punti più estremi. Nella classe +1 i punti C=(4,1) e D=(5,4) sono i più vicini alla classe −1 in direzioni diverse; si fa l'ipotesi che entrambi stiano sul piano w⋅x+b=+1 e che B=(2,3) stia sul piano w⋅x+b=−1 (si verificherà dopo).
Passo 2: direzione di w. Se C e D stanno sullo stesso piano parallelo al bordo, il vettore D−C=(1,3) è parallelo al piano, quindi ortogonale a w: w⋅(1,3)=0. I vettori ortogonali a (1,3) sono multipli di (3,−1): w=t(3,−1).
Passo 3: valori di t e b. Dalle due condizioni:
C su +1: w⋅C+b=t(12−1)+b=11t+b=1;
B su −1: w⋅B+b=t(6−3)+b=3t+b=−1.
Sottraendo la seconda dalla prima: 8t=2, t=0,25. Allora w=(0,75;−0,25) e b=−1−3t=−1,75.
Passo 4: verifica di tutti i punti con mi=yi(w⋅xi+b):
punto
w⋅x+b
y
m=y(w⋅x+b)
A=(1,1)
0,75−0,25−1,75=−1,25
−1
1,25
B=(2,3)
1,5−0,75−1,75=−1
−1
1
C=(4,1)
3−0,25−1,75=1
+1
1
D=(5,4)
3,75−1−1,75=1
+1
1
Tutti mi≥1 e tre uguali a 1: l'ipotesi è corretta. I vettori di supporto sono B, C e D; A è fuori dal margine.
Margine.∥w∥=0,752+0,252=0,625=0,7906. Larghezza totale 2/∥w∥=2,53, cioè 1,26 per lato. (Per essere sicuri che sia il minimo di ∥w∥ si può controllare che nessun altro piano ammissibile abbia norma inferiore: lo conferma la ricerca esaustiva sulle coppie e terne di punti di supporto.)
2. Moltiplicatori αi
Solo i vettori di supporto hanno αi>0: αA=0. Le condizioni sono w=∑αiyixi e ∑αiyi=0:
∑αiyi=0: −αB+αC+αD=0, quindi αB=αC+αD;
componente x: −2αB+4αC+5αD=0,75;
componente y: −3αB+αC+4αD=−0,25.
Sostituendo αB=αC+αD: la seconda diventa 2αC+3αD=0,75 e la terza −2αC+αD=−0,25, da cui αD=2αC−0,25. Sostituendo nella prima: 2αC+6αC−0,75=0,75, αC=0,1875, αD=0,125, αB=0,3125. Tutti positivi, come devono essere.
Verifica.w=−0,3125(2,3)+0,1875(4,1)+0,125(5,4)=(−0,625+0,75+0,625;−0,9375+0,1875+0,5)=(0,75;−0,25) ✓. Valore del duale: ∑αi=0,625 e 21∥w∥2=0,3125; il duale è ∑αi−21∥w∥2 calcolato in w, cioè 0,625−21⋅0,625=0,3125, uguale al primale ✓.
3. Classificazione di (2,5;2)
w⋅x+b=0,75⋅2,5−0,25⋅2−1,75=1,875−0,5−1,75=−0,375. Negativo: classe −1. Il punto è dentro il margine (∣−0,375∣<1), quindi la decisione è poco sicura. Con la forma duale si ottiene lo stesso valore: ∑iαiyi(xi⋅x)+b=−0,3125⋅(5+6)+0,1875⋅(10+2)+0,125⋅(12,5+8)−1,75=−3,4375+2,25+2,5625−1,75=−0,375 ✓.
4. Un punto che viola il margine
E=(3,3), yE=−1: w⋅E+b=2,25−0,75−1,75=−0,25, quindi mE=yE(w⋅E+b)=0,25. Il punto è dal lato giusto ma dentro il margine: ξE=max(0,1−0,25)=0,75. Gli altri punti hanno m≥1, quindi ξ=0.
Obiettivo del piano (w,b): 21∥w∥2+C⋅0,75=0,3125+0,75C.
Piano alternativo w′=(1,2;−0,4), b′=−3,4: ∥w′∥2=1,44+0,16=1,6, 21∥w′∥2=0,8. Margini: A:−(1,2−0,4−3,4)=2,6; B:−(2,4−1,2−3,4)=2,2; C:4,8−0,4−3,4=1; D:6−1,6−3,4=1; E:−(3,6−1,2−3,4)=1. Tutti ≥1: nessuno scarto, obiettivo 0,8 (è il piano a margine rigido di tutti e cinque i punti).
Confronto. Il primo piano è migliore se 0,3125+0,75C<0,8, cioè C<0,65. Con C piccolo (errori poco costosi) conviene il margine largo con uno scarto; con C>0,65 conviene il piano più stretto che separa tutto. Ricordare che si confrontano solo i due candidati: il vero ottimo soft margin si trova risolvendo il problema di ottimizzazione.
Controllo con il codice
python
import numpy as np
from sklearn.svm import SVC
X = np.array([[1,1],[2,3],[4,1],[5,4]]); y = np.array([-1,-1,1,1])
clf = SVC(kernel="linear", C=1e6).fit(X, y) # C enorme ~ margine rigidoprint(clf.coef_, clf.intercept_, clf.support_) # atteso: [[ 0.75 -0.25]] [-1.75], indici 1,2,3print(clf.dual_coef_) # y_i * alpha_i: [[-0.3125 0.1875 0.125 ]]