Pregunta

El uso de kernlab He entrenado un modelo con código como el siguiente:

my.model <- ksvm(result ~ f1+f2+f3, data=gold, kernel="vanilladot")

Ya que es un modelo lineal, prefiero en tiempo de ejecución para calcular las puntuaciones como una simple suma ponderada de los valores de características en lugar de utilizar la maquinaria completa SVM. ¿Cómo puedo convertir el modelo a algo como esto (algunos pesos confeccionados aquí):

> c(.bias=-2.7, f1=0.35, f2=-0.24, f3=2.31)
.bias    f1    f2    f3 
-2.70  0.35 -0.24  2.31 

donde .bias es el término de sesgo y el resto son pesos de funciones?

EDIT:

He aquí algunos datos de ejemplo.

gold <- structure(list(result = c(-1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), f1 = c(0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 
1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1), f2 = c(13.4138113499447, 
13.2216999857095, 12.964145772169, 13.1975227965938, 13.1031520152764, 
13.59351759447, 13.1031520152764, 13.2700658838026, 12.964145772169, 
13.1975227965938, 12.964145772169, 13.59351759447, 13.59351759447, 
13.0897162110721, 13.364151238365, 12.9483051847806, 12.964145772169, 
12.964145772169, 12.964145772169, 12.9483051847806, 13.0937231331592, 
13.5362700880482, 13.3654209223623, 13.4356400945176, 13.59351759447, 
13.2659406408724, 13.4228886221088, 13.5103065354936, 13.5642812689161, 
13.3224757352068, 13.1779418771704, 13.5601730479315, 13.5457299603578, 
13.3729010596517, 13.4823595997866, 13.0965264603473, 13.2710281801434, 
13.4489887206797, 13.5132372154748, 13.5196188787197), f3 = c(0, 
1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0)), .Names = c("result", 
"f1", "f2", "f3"), class = "data.frame", row.names = c(NA, 40L
))
¿Fue útil?

Solución

Para obtener el sesgo, simplemente evaluar el modelo con un vector de características de todos ceros. Para obtener el coeficiente de la primera característica, evaluar el modelo con un vector de características con un "1" en la primera posición, y ceros en todos los demás - y luego restar el sesgo, lo que usted ya sabe. Me temo que no sé sintaxis R, pero conceptualmente quieres algo como esto:

bias = my.model.eval([0, 0, 0])
f1 = my.model.eval([1, 0, 0]) - bias
f2 = my.model.eval([0, 1, 0]) - bias
f3 = my.model.eval([0, 0, 1]) - bias

Para probar que lo hizo correctamente, puede intentar algo como esto:

assert(bias + f1 + f2 + f3 == my.model.eval([1, 1, 1]))

Otros consejos

Si no me equivoco, creo que está pidiendo la manera de extraer el vector W de la SVM, donde W se define como:

W = \sum_i y_i * \alpha_i * example_i

Uf: no se sabe mejor manera de escribir las ecuaciones aquí, pero esto sólo es la suma de los vectores de soporte de peso *. Después de calcular el W, se puede extraer el "peso" de la función que desea.

Asumiendo que esto es correcto, usted:

  1. Obtener los índices de los datos que son los vectores de soporte
  2. Obtener sus pesos (alfa)
  3. Calcular W

kernlab almacena los índices de vectores de soporte y sus valores en una lista (por lo que funciona en problemas multiclase, también), de todos modos cualquier uso de la manipulación lista es sólo para obtener los datos reales (verá que la longitud de la listas devueltas por alpha y alphaindex son sólo 1 si sólo tiene un problema de clase 2, que estoy suponiendo que lo hacen).

my.model <- ksvm(result ~ f1+f2+f3, data=gold, kernel="vanilladot", type="C-svc")
alpha.idxs <- alphaindex(my.model)[[1]]  # Indices of SVs in original data
alphas <- alpha(my.model)[[1]]
y.sv <- gold$result[alpha.idxs]
# for unscaled data
sv.matrix <- as.matrix(gold[alpha.idxs, c('f1', 'f2', 'f3')])
weight.vector <- (y.sv * alphas) %*% sv.matrix
bias <- b(my.model)

kernlab realidad escalas de sus datos antes de hacer su cosa. Usted puede obtener los pesos (en escala) de esta manera (donde, supongo, el sesgo debe ser 0 (?))

weight.vector <- (y.sv * alphas) %*% xmatrix(my.model)[[1]]

Si he entendido bien su pregunta, esto debe conseguir lo que está buscando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top