【发布时间】:2014-06-03 14:18:02
【问题描述】:
我正在使用libsvm,并且我做了一个非常简单的实验,训练了 10k 个向量并仅用 22 个进行了测试。我使用的是参数成本为 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 都使用线性核,具有相同的成本参数并使用相同的方法进行多类分类,结果不应该是一样的吗?
【问题讨论】:
-
也许最优不是唯一的? (有共线性吗?)
标签: r matlab svm libsvm liblinear