5

kernlab パッケージで不可解な動作を見つけました。数学的に同一の SVM を推定すると、ソフトウェアでは異なる結果が生成されます。

このコード スニペットは、簡単にするために、虹彩データを取得して二項分類の問題にしています。ご覧のとおり、両方の SVM で線形カーネルを使用しています。

library(kernlab)
library(e1071)

data(iris)
x <- as.matrix(iris[, 1:4])
y <- as.factor(ifelse(iris[, 5] == 'versicolor', 1, -1))
C <- 5.278031643091578

svm1 <- ksvm(x = x, y = y, scaled = FALSE, kernel = 'vanilladot', C = C)

K <- kernelMatrix(vanilladot(), x)
svm2 <- ksvm(x = K, y = y, C = C, kernel = 'matrix')

svm3 <- svm(x = x, y = y, scale = FALSE, kernel = 'linear', cost = C)

ただし、svm1 と svm2 の要約情報は劇的に異なります。kernlab は、2 つのモデル間で完全に異なるサポート ベクター数、トレーニング エラー率、および目的関数値をレポートします。

> svm1
Support Vector Machine object of class "ksvm" 

SV type: C-svc  (classification) 
 parameter : cost C = 5.27803164309158 

Linear (vanilla) kernel function. 

Number of Support Vectors : 89 

Objective Function Value : -445.7911 
Training error : 0.26 
> svm2
Support Vector Machine object of class "ksvm" 

SV type: C-svc  (classification) 
 parameter : cost C = 5.27803164309158 

[1] " Kernel matrix used as input."

Number of Support Vectors : 59 

Objective Function Value : -292.692 
Training error : 0.333333

比較のために、libsvm パッケージの R インターフェイスを提供する e1071 を使用して同じモデルも計算しました。

svm3

Call:
svm.default(x = x, y = y, scale = FALSE, kernel = "linear", cost = C)


Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  linear 
       cost:  5.278032 
      gamma:  0.25 

Number of Support Vectors:  89

It reports 89 support vectors, the same as svm1.

私の質問は、kernlab パッケージに、この異常な動作の原因となる既知のバグがあるかどうかです。

(R の Kernlab は、事前にパッケージ化された複数のカーネル関数の 1 つ、またはユーザーが指定したカーネル マトリックスを使用できるようにする SVM ソルバーです。出力は、ユーザーが指定したハイパーパラメーターのサポート ベクター マシンの推定値です。)

4

1 に答える 1

3

コードの一部を確認すると、これが問題のある行であることがわかります。

https://github.com/cran/kernlab/blob/efd7d91521b439a993efb49cf8e71b57fae5fc5a/src/svm.cpp#L4205

つまり、ユーザー提供のカーネル行列の場合ksvm、入力の次元が何であれ、ではなく、単に 2 つの次元を見ているだけです。これは奇妙に思えます。おそらく、いくつかのテストなどからの持ち越しです。ちょうど 2 次元のデータを使用した線形カーネルのテストでは、同じ結果が得られます。上記を に置き換える1:41:2、出力と予測がすべて一致します。

于 2015-12-01T18:00:27.633 に答える