J'essaie d'interpréter les poids variables donnés en ajustant un SVM linéaire.
Un bon moyen de comprendre comment les poids sont calculés et comment les interpréter dans le cas d'un SVM linéaire consiste à effectuer les calculs à la main sur un exemple très simple.
Exemple
Considérez le jeu de données suivant qui est séparable linéairement
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 ])
Résoudre le problème SVM par inspection
X2= x1- 3wTx + b = 0
w = [ 1 , - 1 ] b = - 3
2|| w | |22√= 2-√4 2-√
c
c x1- c x2- 3 c = 0
w = [ c , - c ] b = - 3 c
Rebrancher dans l'équation pour la largeur que nous obtenons
2| | w | |22-√cc = 14= 4 2-√= 4 2-√
w = [ 14, - 14] b = - 3 4
(J'utilise scikit-learn)
Moi aussi, voici du code pour vérifier nos calculs manuels
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]
- Indices de vecteurs de support = [2 3]
- Vecteurs de support = [[2. 3.] [6. -1.]]
- Nombre de vecteurs de support pour chaque classe = [1 1]
- Coefficients du vecteur support dans la fonction de décision = [[0.0625 0.0625]]
Le signe du poids a-t-il quelque chose à voir avec la classe?
Pas vraiment, le signe des poids a à voir avec l'équation du plan frontière.
La source
https://ai6034.mit.edu/wiki/images/SVM_and_Boosting.pdf