Próbuję zinterpretować zmienne wagi podane przez dopasowanie liniowego SVM.
Dobrym sposobem na zrozumienie, w jaki sposób obliczane są wagi i jak je interpretować w przypadku liniowej SVM, jest wykonanie obliczeń ręcznie na bardzo prostym przykładzie.
Przykład
Rozważ następujący zestaw danych, który można liniowo oddzielić
import numpy as np
X = np.array([[3,4],[1,4],[2,3],[6,-1],[7,-1],[5,-3]] )
y = np.array([-1,-1, -1, 1, 1 , 1 ])
Rozwiązanie problemu SVM przez inspekcję
Po inspekcji możemy zobaczyć, że linią graniczną oddzielającą punkty o największym „marginesie” jest linia . Ponieważ wagi SVM są proporcjonalne do równania tej linii decyzyjnej (hiperpłaszczyzna w wyższych wymiarach) przy użyciu pierwsze przypuszczenie parametrów byłobyx2=x1−3wTx+b=0
w=[1,−1] b=−3
Teoria SVM mówi nam, że „szerokość” marginesu jest wyrażona przez . Stosując powyższą przypuszczenie chcemy uzyskać szerokość o . co przez kontrolę jest nieprawidłowe. Szerokość wynosi2||w||22√=2–√42–√
Przypomnijmy, że skalowanie granicy przez współczynnik nie zmienia linii granicznej, dlatego możemy uogólnić równanie jakoc
cx1−cx2−3c=0
w=[c,−c] b=−3c
Wracając do równania dla szerokości, którą otrzymujemy
2||w||22–√cc=14=42–√=42–√
Zatem parametry (lub współczynniki) są w rzeczywistości
w=[14,−14] b=−34
(Używam scikit-learn)
Oto ja, oto kod do sprawdzenia naszych ręcznych obliczeń
from sklearn.svm import SVC
clf = SVC(C = 1e5, kernel = 'linear')
clf.fit(X, y)
print('w = ',clf.coef_)
print('b = ',clf.intercept_)
print('Indices of support vectors = ', clf.support_)
print('Support vectors = ', clf.support_vectors_)
print('Number of support vectors for each class = ', clf.n_support_)
print('Coefficients of the support vector in the decision function = ', np.abs(clf.dual_coef_))
- w = [[0,25 -0,25]] b = [-0,75]
- Wskaźniki wektorów wsparcia = [2 3]
- Wektory wsparcia = [[2. 3.] [6. -1.]]
- Liczba wektorów pomocniczych dla każdej klasy = [1 1]
- Współczynniki wektora podporowego w funkcji decyzyjnej = [[0,0625 0,0625]]
Czy znak wagi ma coś wspólnego z klasą?
Nie bardzo, znak wag ma związek z równaniem płaszczyzny granicznej.
Źródło
https://ai6034.mit.edu/wiki/images/SVM_and_Boosting.pdf