Ich wollte benutzerdefinierte Kernel-Funktion für Ksvm in R verwenden. Also habe ich versucht, einen vanilladot-Kernel zu machen und mit "vacaldot" zu vergleichen, die in "Kernlab" als Übung eingebaut ist.(in R) Warum unterscheidet sich das Ergebnis von ksvm, das den benutzerdefinierten linearen Kernel verwendet, von dem von ksvm, das "vanilladot" verwendet?
Ich schreibe meinen Kernel wie folgt.
#
###vanilla kernel with class "kernel"
#
kfunction.k <- function(){
k <- function (x,y){crossprod(x,y)}
class(k) <- "kernel"
k}
l<-0.1 ; C<-1/(2*l)
###use kfunction.k
tmp<-ksvm(x,factor(y),scaled=FALSE, type = "C-svc", kernel=kfunction.k(), C = C)
alpha(tmp)[[1]]
ind<-alphaindex(tmp)[[1]]
x.s<-x[ind,] ; y.s<-y[ind]
w.class.k<-t(alpha(tmp)[[1]]*y.s)%*%x.s
w.class.k
Das Ergebnis dieser Operation ist äquivalent zu dem folgenden. Allerdings nicht.
#
###use "vanilladot"
#
l<-0.1 ; C<-1/(2*l)
tmp1<-ksvm(x,factor(y),scaled=FALSE, type = "C-svc", kernel="vanilladot", C = C)
alpha(tmp1)[[1]]
ind1<-alphaindex(tmp1)[[1]]
x.s<-x[ind1,] ; y.s<-y[ind1]
w.tmp1<-t(alpha(tmp1)[[1]]*y.s)%*%x.s
w.tmp1
Ich denke, dass dieses Problem möglicherweise mit der Kernel-Klasse zusammenhängt. Wenn die Klasse auf "Kernel" eingestellt ist, ist dieses Problem aufgetreten. Wenn die Klasse jedoch auf "vanerkernel" gesetzt ist, entspricht das Ergebnis von ksvm, das den benutzerdefinierten Kernel verwendet, dem von ksvm, das "valladot" verwendet, das in Kernlab erstellt wird.
#
###vanilla kernel with class "vanillakernel"
#
kfunction.v.k <- function(){
k <- function (x,y){crossprod(x,y)}
class(k) <- "vanillakernel"
k}
# The only difference between kfunction.k and kfunction.v.k is "class(k)".
l<-0.1 ; C<-1/(2*l)
###use kfunction.v.k
tmp<-ksvm(x,factor(y),scaled=FALSE, type = "C-svc", kernel=kfunction.v.k(), C = C)
alpha(tmp)[[1]]
ind<-alphaindex(tmp)[[1]]
x.s<-x[ind,] ; y.s<-y[ind]
w.class.v.k<-t(alpha(tmp)[[1]]*y.s)%*%x.s
w.class.v.k
Ich verstehe nicht, warum das Ergebnis von „vanilladot“ anders ist, wenn die Klasse auf „Kernel“.
Gibt es einen Fehler in meiner Operation?
Ich denke, dass der relevante Code tatsächlich in einem anderen Teil der Quelle ist. Die Frage hat type = "C-svc", aber der Code in der Antwort zeigt type (ret) == "spoc-svc". Ich denke, der passende Code kommt nach type (ret) == "C-svc". [Hier] (https://github.com/cran/kernlab/blob/efd7d91521b439a993efb49cf8e71b57fae5fc5a/R/ksvm.R#L1056-L1145), nicht [hier] (https://github.com/cran/kernlab/blob/ efd7d91521b439a993efb49cf8e71b57fae5fc5a/R/ksvm.R # L1333-L1385). Recht? Beachten Sie, dass die C++ - Funktion smo_optim aufgerufen wird, nicht tron_optim – kdauria
Eine verwandte [Antwort] (http://stackoverflow.com/questions/33813972/kernlab-kraziness-inconsistens-results-for-identical-problems) finden, dass 'qpsize' könnte der Schuldige sein. – kdauria