Estoy tratando de interpretar los pesos variables dados ajustando un SVM lineal.
Una buena manera de entender cómo se calculan los pesos y cómo interpretarlos en el caso de SVM lineal es realizar los cálculos a mano en un ejemplo muy simple.
Ejemplo
Considere el siguiente conjunto de datos que es linealmente separable
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 ])
Resolviendo el problema SVM por inspección
X2= x1- 3wTx + b = 0
w = [ 1 , - 1 ] b = - 3
2El | El | w | El |22√= 2-√4 2-√
do
c x1- c x2- 3 c = 0
w = [ c , - c ] b = - 3 c
Conectando nuevamente a la ecuación para el ancho que obtenemos
2El | El | w | El |22-√doc = 14 4= 4 2-√= 4 2-√
w = [ 14 4, - 14 4] b = - 3 4 4
(Estoy usando scikit-learn)
Yo también, aquí hay un código para verificar nuestros cálculos manuales
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]
- Índices de vectores de soporte = [2 3]
- Vectores de soporte = [[2. 3.] [6. -1.]]
- Número de vectores de soporte para cada clase = [1 1]
- Coeficientes del vector de soporte en la función de decisión = [[0.0625 0.0625]]
¿El signo del peso tiene algo que ver con la clase?
En realidad no, el signo de los pesos tiene que ver con la ecuación del plano límite.
Fuente
https://ai6034.mit.edu/wiki/images/SVM_and_Boosting.pdf