e1071 libsvmの問題?


13

2つの重複するクラス(各クラスに7つのポイント、ポイントは2次元空間)を持つデータセットがあります。Rでは、これらのクラスの分離ハイパープレーンを構築するためにパッケージから実行svmしていe1071ます。私は次のコマンドを使用しています:

svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)

ここにxは私のデータポイントとyそのラベルが含まれています。このコマンドはsvm-objectを返します。これを使用して、分離する超平面のパラメーター(法線ベクトル)とb(切片)を計算します。wb

下の図(a)は、私のポイントとsvmコマンドによって返された超平面を示しています(この超平面を最適なものと呼びましょう)。記号Oの付いた青い点はスペースの原点を示し、点線はマージンを示し、丸で囲まれた点は非ゼロの(スラック変数)を持ちます。ξ

図(b)は別の超平面を示しています。これは、最適な平面を5だけ平行移動したものです(b_new = b_optimal-5)。この超平面の目的関数 (C-分類SVMによって最小化される)は、図()に示す最適な超平面の場合よりも低い値を有するであろう。この機能に問題があるように見えますか?または、どこかでミスをしましたか?

0.5||w||2+costξ
svm

ここに画像の説明を入力してください

以下は、この実験で使用したRコードです。

library(e1071)

get_obj_func_info <- function(w, b, c_par, x, y) {
    xi <- rep(0, nrow(x))

    for (i in 1:nrow(x)) {
        xi[i] <- 1 - as.numeric(as.character(y[i]))*(sum(w*x[i,]) + b)
        if (xi[i] < 0) xi[i] <- 0
    }

    return(list(obj_func_value = 0.5*sqrt(sum(w * w)) + c_par*sum(xi), 
                    sum_xi = sum(xi), xi = xi))
}

x <- structure(c(41.8226593092589, 56.1773406907411, 63.3546813814822, 
66.4912298720281, 72.1002963174962, 77.649309469458, 29.0963054665561, 
38.6260575252066, 44.2351239706747, 53.7648760293253, 31.5087701279719, 
24.3314294372308, 21.9189647758150, 68.9036945334439, 26.2543850639859, 
43.7456149360141, 52.4912298720281, 20.6453186185178, 45.313889181287, 
29.7830021158501, 33.0396571934088, 17.9008386892901, 42.5694092520593, 
27.4305907479407, 49.3546813814822, 40.6090664454681, 24.2940422573947, 
36.9603428065912), .Dim = c(14L, 2L))

y <- structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("-1", "1"), class = "factor")

a <- svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)

w <- t(a$coefs) %*% a$SV;
b <- -a$rho;

obj_func_str1 <- get_obj_func_info(w, b, 50000, x, y)
obj_func_str2 <- get_obj_func_info(w, b - 5, 50000, x, y)

コストパラメータを調整しましたか?
エティエンヌラシーン

BUGSタグは、ソフトウェアの問題ではなく、ギブスサンプリングを使用したベイジアン推論を指すことに注意してください。タグを削除しました。
Sycoraxが復活モニカ言う

回答:


5

libsvm FAQには、アルゴリズムの「内部」で使用されるラベルがあなたのものと異なる可能性があることが記載されています。これにより、モデルの「コーフ」の符号が反転する場合があります。

y=[1,+1,+1,1,...]y+11

αnynwy

「予測ラベルと判定値の符号が逆になることがあるのはなぜですか」という質問を参照してください。こちら


4

MATLABでLIBSVMを使用して同じ問題に遭遇しました。それをテストするために、非常に単純な2D線形分離可能なデータセットを作成しました。LIBSVMを使用して線形svmをトレーニングすると、インターセプトがまだほぼゼロのハイパープレーンが生成されました(したがって、エラー率は当然50%でした)。データの標準化(平均値の減算)は役立ちましたが、結果のsvmはまだ完全に実行されませんでした...困惑しています。LIBSVMは、変換せずに軸を中心に超平面を回転させるだけのようです。おそらく、データから平均値を減算する必要がありますが、LIBSVMがこのように動作するのは奇妙に思えます。おそらく私たちは何かを見逃しています。

価値のあることとして、組み込みのMATLAB関数svmtrainは、標準化なしで100%の精度で分類器を生成しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.