我正在使用libsvm并且做了一个非常简单的实验,训练 10k 个向量并仅使用 22 个进行测试。我正在使用带参数 cost 的线性内核C=1
。我的问题是多类。所以 Libsvm 将使用一对一的方法对我的数据进行分类。Libsvm 使用SMO来寻找分离的超平面。
我的一个朋友做了同样的实验,但使用的 SVM 分类器来自Statistics Toolbox。他还使用了R 的e1071包。同样,使用的内核是线性内核,参数成本C
等于 1,并且在 MATLAB 中使用一对一的方法对数据进行分类(一对一方法是由我的朋友编写的)和 e1071 R 包。默认情况下,R 中的 MATLAB Statistics Toolbox 和 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 个
- 我朋友的一对一 MATLAB 实现正确分类了 22 个特征向量中的 19 个。
那么为什么预测不同呢?我的意思是,如果所有 SVM 都使用线性内核,具有相同的成本参数并使用相同的多类分类方法,那么结果不应该相同吗?