[R] e1071/svm?
David Meyer
david.meyer at ci.tuwien.ac.at
Thu Jan 3 13:26:50 CET 2002
OK, after having inspected the code of libsvm, I agree it is not
completely obvious to use the results produced by svm() for prediction.
For class prediction in the binary case, the class of a new data vector
``n'' is usually given by *the sign* of
Sum(a_i * y_i * K(x_i, n)) + rho
i
where x_i is the i-th support vector, y_i the corresponding label, a_i
the corresponding coefficiant, and K is the kernel (in your case, the
linear one, so
K(u,v) = u'v).
Now, ``libsvm'' actually returns a_i * y_i as i-th coefficiant and the
*negative* rho, so in fact uses the formula:
Sum(coef_i * K(x_i, n)) - rho
i
where the training examples (=training data) are labeled {1,-1}.
A simplified R function for prediction with linear kernel would be:
svmpred <- function (m, newdata, K=crossprod) {
## this guy does the computation:
pred.one <- function (x)
sign(sum(sapply(1:m$tot.nSV, function (j)
K(m$SV[j,], x) * m$coefs[j]
)
) - m$rho
)
## this is just for convenience:
if (is.vector(newdata))
newdata <- t(as.matrix(x))
sapply (1:nrow(newdata),
function (i) pred.one(newdata[i,]))
}
where ``pred.one'' does the actual prediction for one new data vector,
the rest is just a convenience for prediction of multiple new examples.
It's easy to extend this to other kernels, just replace ``K'' with the
appropriate function [see the help page for the formulas used] and
supply the additional constants.
Note, however, that multi-class prediction is more complicated, because
the coefficiants of the diverse binary svm's are stored in a compressed
format.
And finally, you could directly use the C source code of libsvm, if your
target language supports foreign function calls.
regards,
-d
Alexander Skomorokhov wrote:
>
> Thank you fot your reply. Sorry, but I still haven't got the problem.
> Here is a trivial example (cpy from R session):
> ----------------------------------------------------------------------------
> ------------------
> > x
> [,1] [,2]
> [1,] 0 0
> [2,] 0 1
> [3,] 1 0
> [4,] 1 1
> [5,] 2 2
> [6,] 2 3
> [7,] 3 2
> [8,] 3 3
> > y
> [1] 1 1 1 1 2 2 2 2
> Levels: 1 2
> > is.factor(y)
> [1] TRUE
> > library(e1071)
> > m<-svm(x,y,kernel='linear')
> *
> optimization finished, #iter = 3
> nu = 0.250000
> obj = -1.000000, rho = -3.000000
> nSV = 2, nBSV = 2
> Total nSV = 2
>
> > summary(m)
> Call:
> svm.default(x = x, y = y, kernel = "linear")
> Parameters:
> SVM-Type: C-classification
> SVM-Kernel: linear
> cost: 1
> degree: 3
> gamma: 0.5
> coef.0: 0
> nu: 0.5
> epsilon: 0.5
> cost: 1
> Number of Support Vectors: 2 ( 1 1 )
> Number of Classes: 2
> Levels:
> 1 2
> Rho:
> -3
> Support Vectors:
> [,1] [,2]
> [1,] 1 1
> [2,] 2 2
> Coefficiants:
> [,1]
> [1,] 1
> [2,] -1
> ----------------------------------------------------------------------------
> ----------
> I see Coefficiants, but can't guess how to use them (only them?) for
> prediction???
> I may guess that the question sounds like a stupid one, but it is that:-(
>
> Thanks,
> Alexander.
>
> > -----Original Message-----
> > From: meyer at ci.tuwien.ac.at [mailto:meyer at ci.tuwien.ac.at]On
> > Behalf Of David Meyer
> > Sent: Thursday, December 20, 2001 3:03 PM
> > To: askom at obninsk.com
> > Cc: r-help
> > Subject: Re: [R] e1071/svm?
> >
> >
> > Alexander Skomorokhov wrote:
> > >
> > > Hello,
> > >
> > > I use function "svm" (interface to libsvm) from package e1071.
> > It works just
> > > fine.
> > > And I may predict with function "predict" and svm model trained
> > by function
> > > "svm".
> > > What I need is moving results of svm training to another
> > application (non-R)
> > > and
> > > perform prediction there. But function "svm" returns list of
> > support vectors
> > > only
> > > and doesn't return coefficients of separating hyperplane (w).
> >
> > It does (element ``coefs'' of the returned object).
> >
> > g.
> > -d
> >
> > >
> > > So, the question is how to use results of svm training to write
> > (in other
> > > language)
> > > prediction function for linear and nonlinear cases?
> > >
> > > Thanks,
> > > Alexander.
> > >
> > >
> > -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
> > -.-.-.-.-.-.-
> > > r-help mailing list -- Read
> http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> > Send "info", "help", or "[un]subscribe"
> > (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch
> >
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.
> _._
>
> --
> Mag. David Meyer Wiedner Hauptstrasse 8-10
> Vienna University of Technology A-1040 Vienna/AUSTRIA
> Department for Tel.: (+431) 58801/10772
> Statistics and Probability Theory mail: david.meyer at ci.tuwien.ac.at
>
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> Send "info", "help", or "[un]subscribe"
> (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
--
Mag. David Meyer Wiedner Hauptstrasse 8-10
Vienna University of Technology A-1040 Vienna/AUSTRIA
Department for Tel.: (+431) 58801/10772
Statistics and Probability Theory mail: david.meyer at ci.tuwien.ac.at
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
More information about the R-help
mailing list