8

私はlibsvmを使用しており、非常に単純な実験を行い、10k ベクトルをトレーニングし、わずか 22 でテストしました。パラメータ cost で線形カーネルを使用していますC=1。私の問題はマルチクラスです。したがって、Libsvm は 1 対 1 のアプローチを使用してデータを分類します。Libsvm はSMOを使用して分離ハイパープレーンを見つけます。

私の友人が同じ実験をしましたが、使用した SVM 分類器はStatistics Toolboxからのものでした。彼は R のe1071パッケージも使用しました。ここでも、使用したカーネルは線形カーネルで、パラメーター コストCは 1 に等しく、MATLAB でデータを分類するために 1 対 1 アプローチが使用されています (1 対 1アプローチは私の友人によってコーディングされました) と e1071 R パッケージ。MATLAB Statistics Toolbox と R の e1071 はどちらも、既定で分離超平面を見つけるために SMO アプローチを使用します。

最新のLIBLINEARライブラリも試しました。繰り返しますが、同じ構成が使用されました。


使用されるコードは次のとおりです。

libsvm 3.18 (コマンドライン)

./svm-scale -s train.range train.libsvm > train.scale 
./svm-scale -r train.range test.libsvm > test.scale
./svm-train -t 0 -c 1 train.scale train.model
./svm-predict test.scale train.model test.predict

liblinear 1.94 (コマンドライン)

./svm-scale -s train.range train.libsvm > train.scale 
./svm-scale -r train.range test.libsvm > test.scale
./train train.scale train.model
./predict test.scale train.model test.predict

R

rm(list = ls())
cat("\014")
library(e1071)

cat("Training model\n")
Traindata = read.csv("train.csv", header=FALSE)
SVM_model = svm(Traindata[,2:ncol(Traindata)], Traindata[,1], kernel="linear",     tolerance=0.1, type="C-classification")
print(SVM_model)

cat("Testing model\n")
Testdata = read.csv("test.csv", header=FALSE)
Preddata = predict(SVM_model, Testdata[,2:ncol(Testdata)])

ConfMat = table(pred=Preddata, true=Testdata[,1])
print(ConfMat)

accuracy = 0
for (i in 1 : nrow(ConfMat)) {
   for (j in 1 : ncol(ConfMat)) {
       if (i == j) {
          accuracy = accuracy + ConfMat[i, i]
       }
   }
 }
 accuracy = (accuracy / sum(ConfMat)) * 100
 cat("Test vectors:", dim(Testdata), ", Accuracy =", accuracy, "%\n")

いくつかの精度の違いがあります:

  • Libsvm は 22 個のテスト特徴ベクトルのうち 11 個を正しく分類しました
  • liblinear は 22 個のテスト特徴ベクトルのうち 18 個を正しく分類しました
  • R は 22 個のテスト特徴ベクトルのうち 17 個を正しく分類しました
  • 私の友人の 1 対 1 の MATLAB 実装は、22 個の特徴ベクトルのうち 19 個を正しく分類しました。

では、なぜ予測が異なるのでしょうか。つまり、すべての SVM が線形カーネルを使用し、コスト パラメーターが同じで、マルチクラス分類に同じアプローチを使用している場合、結果は同じではないでしょうか?

4

1 に答える 1