3

R で SVM 分類器をトレーニングし、関連するパラメーターをエクスポートすることで、他のソフトウェアで使用できるようにしたいと考えています。そのためには、まずpredict.svm()R での動作を (e1071パッケージを使用して) 再現できるようにしたいと考えています。

虹彩データに基づいてモデルをトレーニングしました。

data(iris)

# simplify the data by removing the third label
ir <- iris[1:100,]
ir$Species <- as.factor(as.integer(ir$Species))

# train the model
m <- svm(Species ~ ., data=ir, cost=8)

# the model internally uses a scaled version of the data, example:
m$x.scale
# # # # # 
# $`scaled:center`
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
#        5.471        3.099        2.861        0.786 
#
# $`scaled:scale`
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
#    0.6416983    0.4787389    1.4495485    0.5651531 
# # # # #

# because the model uses scaled data, make a scaled data frame
irs<-ir;
sc<-data.frame(m$x.scale);
for(col in row.names(sc)){
      irs[[col]]<-(ir[[col]]-sc[[col,1]])/sc[[col,2]]
}

# a radial kernel function
k<-function(x,x1,gamma){
    return(exp(-gamma*sum((x-x1)^2)))
}

Hastie、Tibshirani、Friedman (2001) の式 12.24 によると、x の予測関数は、係数に SV のカーネル関数と x を掛けたサポート ベクターの合計として記述できます。これは、行列の積に対応し、プラスインターセプト。

$\hat{f}(x)= \sum^N_{i=1} \hat{\alpha}_i y_i K(x,x_i)+\hat{\beta}_0 $、ここで $y_i$ は既に含まれていますでm$coefs

# m$coefs contains the coefficients of the support vectors, m$SV 
# the support vectors, and m$rho the *negative* intercept
f<-function(x,m){
    return(t(m$coefs) %*% as.matrix(apply(m$SV,1,k,x,m$gamma)) - m$rho)
}

# a prediction function based on the sign of the prediction function
my.predict<-function(m,x){
    apply(x,1,function(y) sign(f(y,m)))
}

# applying my prediction function to the scaled data frame should
# yield the same result as applying predict.svm() to the original data
# example, thus the table should show one-to-one correspondence:
table(my.predict(m,irs[,1:4]),predict(m,ir[,1:4]))

# the unexpected result:    
# # # # #
#      1  2
#  -1  4 24
#  1  46 26
# # # # #

これがどこで間違っているのか誰が説明できますか?

編集:私のコードにマイナーなエラーがありましたが、次の期待される結果が得られます:

      1  2
  -1  0 50
  1  50  0

同じ問題に直面している人の助けになれば幸いです。

4

1 に答える 1

1

関数の 1 つに軽微なエラーがありました。編集されたバージョンが機能します。

于 2013-01-17T13:43:49.707 に答える