Pergunta

Usando kernlab Eu treinei um modelo com um código como o seguinte:

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

Uma vez que é um modelo linear, eu prefiro em tempo de execução para calcular a pontuação como uma soma ponderada simples dos valores de recursos ao invés de usar a maquinaria SVM completo. Como posso converter o modelo para algo como isto (alguns pesos confeccionados aqui):

> 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 

onde .bias é o termo preconceito eo resto são pesos recurso?

EDIT:

Eis alguns exemplos de dados.

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
))
Foi útil?

Solução

Para obter o preconceito, apenas avaliar o modelo com um vetor de características de todos os zeros. Para obter o coeficiente do primeiro recurso, avaliar o modelo com um vetor de características com um "1" na primeira posição, e zeros em qualquer outro lugar - e depois subtrair o viés, o que você já sabe. Eu tenho medo Eu não sei sintaxe R, mas conceitualmente você quer algo parecido com isto:

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 teste que você fez isso corretamente, você pode tentar algo como isto:

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

Outras dicas

Se não me engano, acho que você está perguntando como extrair o vetor W do SVM, onde W é definido como:

W = \sum_i y_i * \alpha_i * example_i

Ugh: não sei melhor maneira de equações escrita aqui, mas isso só é a soma do peso * vetores de suporte. Depois de calcular o W, você pode extrair o "peso" para o recurso que você deseja.

Assumindo que isso é correto, você:

  1. Obter os índices de seus dados, que são os vetores de suporte
  2. Obter seus pesos (alphas) ??
  3. Calcular W

lojas kernlab os índices de vetor de suporte e seus valores em uma lista (assim que trabalha em problemas multiclasse, também), de qualquer maneira qualquer uso da lista de manipulação é apenas para obter os dados reais (você verá que o comprimento do listas retornadas por alpha e alphaindex são apenas 1 se você só tem um problema de 2 classe, que eu estou supondo que você faz).

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 realmente dimensiona os seus dados antes de fazer a sua coisa. Você pode obter os (escala) pesos assim (onde, eu acho, o viés deve ser 0 (?))

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

Se eu entendi sua pergunta, isso deve te dar o que você está depois.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top