2011-09-12 32 views
17

私は、SVMのパフォーマンスをテストして、いくつかの個人を4つのグループ/クラスに分類することに興味があります。 MATLABのsvmtrain LibSVM関数を使用するとき、私はこの方程式の値に基づいて4つのグループの中でそれらの個体を分類するために使用される3つの方程式を得ることができます。方式は次のようになります:e1071 RパッケージのSVM方程式?

   All individuals (N)* 
         | 
Group 1 (n1) <--- equation 1 ---> (N-n1) 
             | 
        (N-n1-n2) <--- equation 2 ---> Group 2 (n2) 
         | 
Group 3 (n3) <--- equation 3 ---> Group 4(n4) 

*N = n1+n2+n3+n4 

e1071 Rパッケージのsvm関数を使用してこれらの式を得る方法はありますか?

答えて

39

svme1071)は、マルチクラス分類(すなわち、すべてのペア間のバイナリ分類、その後の投票)に「1対1」戦略を使用します。したがって、この階層的な設定を処理するには、グループ1対すべて、グループ2対何か他のものなど、一連のバイナリ分類子を手動で実行する必要があります。さらに、基本的なsvm関数は、通常は、caretパッケージのtunee1071、またはtrainのラッパーを使用することをお勧めします。

とにかく、Rで新しい個体を分類するために、式を手動で数式に差し込む必要はありません。むしろ、predict汎用関数を使用します。これには、SVMのような異なるモデル用のメソッドがあります。このようなモデルオブジェクトの場合、通常は汎用関数plotsummaryを使用することもできます。ここでは線形SVMを使用した基本的な考え方の一例である:

require(e1071) 

# Subset the iris dataset to only 2 labels and 2 features 
iris.part = subset(iris, Species != 'setosa') 
iris.part$Species = factor(iris.part$Species) 
iris.part = iris.part[, c(1,2,5)] 

# Fit svm model 
fit = svm(Species ~ ., data=iris.part, type='C-classification', kernel='linear') 

# Make a plot of the model 
dev.new(width=5, height=5) 
plot(fit, iris.part) 

# Tabulate actual labels vs. fitted labels 
pred = predict(fit, iris.part) 
table(Actual=iris.part$Species, Fitted=pred) 

# Obtain feature weights 
w = t(fit$coefs) %*% fit$SV 

# Calculate decision values manually 
iris.scaled = scale(iris.part[,-3], fit$x.scale[[1]], fit$x.scale[[2]]) 
t(w %*% t(as.matrix(iris.scaled))) - fit$rho 

# Should equal... 
fit$decision.values 

enter image description here

は、モデル予測対実際のクラスラベル表にする:svmモデルオブジェクトから

> table(Actual=iris.part$Species, Fitted=pred) 
      Fitted 
Actual  versicolor virginica 
    versicolor   38  12 
    virginica   15  35 

抽出機能の重みを(のために機能の選択など)。ここでは、明らかにより有用なのはSepal.Lengthです。決定値はどこから来た、我々は機能の重みと前処理された特徴ベクトルの内積としてそれらを手動で計算することができ、マイナス切片はrhoオフセット理解する

> t(fit$coefs) %*% fit$SV 
    Sepal.Length Sepal.Width 
[1,] -1.060146 -0.2664518 

> t(w %*% t(as.matrix(iris.scaled))) - fit$rho 
     [,1] 
51 -1.3997066 
52 -0.4402254 
53 -1.1596819 
54 1.7199970 
55 -0.2796942 
56 0.9996141 
... 

を(前処理さがおそらく中心/スケーリングおよび/またはなど、RBF SVMを使用した場合は変換カーネル意味)これは内部的に計算されたものと等しくなる必要があります:あなたは、ジョンに答えるため

> head(fit$decision.values) 
    versicolor/virginica 
51   -1.3997066 
52   -0.4402254 
53   -1.1596819 
54   1.7199970 
55   -0.2796942 
56   0.9996141 
... 
+0

感謝を。なぜなら、これらの方程式を知りたいのは、私のイベントを分類する際に、合計からどのパラメータが重要かを評価するためです。 –

+2

@ManuelRamónAhh gotcha。これらをリニアSVMの「重み」といいます。 svmモデルオブジェクトからの計算方法については、上記の編集を参照してください。がんばろう! –

+1

あなたの例には2つのカテゴリ(versicolorとvirginica)しかなく、2つのcoeffcientsを持つベクトルがあります.1つは虹彩データを分類するための変数です。 N個のカテゴリを持っているなら、 'with(fit、t(coefs)%*%SV)'からN-1ベクトルを得る。各ベクトルの意味は? –