我正在使用libsvm并且我做了一个非常简单的实验,训练10k向量并且仅用22进行测试.我使用带参数成本的线性内核C=1.我的问题是多类.所以Libsvm将使用一对一的方法对我的数据进行分类.Libsvm使用SMO来查找分离超平面.
我的一个朋友做了同样的实验,但使用的SVM分类器来自统计工具箱.他还使用了来自R 的e1071软件包.再次,使用的内核是线性内核,参数成本C等于1,并且使用一对一方法对MATLAB中的数据进行分类(一对一方法由我的朋友编写)和e1071 R包.MATLAB统计工具箱和R的e1071都默认使用SMO方法查找分离超平面.
我也尝试了最新的LIBLINEAR库.同样,使用相同的配置.
以下是使用的代码:
./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
Run Code Online (Sandbox Code Playgroud)
./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
Run Code Online (Sandbox Code Playgroud)
rm(list = ls())
cat("\014")
library(e1071)
cat("Training model\n")
Traindata = read.csv("train.csv", header=FALSE)
SVM_model = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用该LinearSVC对象进行以下简单分类scikit-learn.我尝试过同时使用0.10和0.14版本.使用代码:
from sklearn.svm import LinearSVC, SVC
from numpy import *
data = array([[ 1007., 1076.],
[ 1017., 1009.],
[ 2021., 2029.],
[ 2060., 2085.]])
groups = array([1, 1, 2, 2])
svc = LinearSVC()
svc.fit(data, groups)
svc.predict(data)
Run Code Online (Sandbox Code Playgroud)
我得到输出:
array([2, 2, 2, 2])
Run Code Online (Sandbox Code Playgroud)
但是,如果我用分隔符替换分类器
svc = SVC(kernel='linear')
Run Code Online (Sandbox Code Playgroud)
然后我得到了结果
array([ 1., 1., 2., 2.])
Run Code Online (Sandbox Code Playgroud)
哪个是对的.有谁知道为什么使用LinearSVC会破坏这个简单的问题?
我试图liblinear在C ++中工作,但是对库的调用train(problem*, parameter*)将输出发送到终端。有时它说优化已完成,而其他时候似乎正在输出内部状态(为什么?)。此输出是什么意思,有可能抑制它或将其转移到某处的日志中吗?我boost::log在程序的其余部分中使用,并且我想控制程序显示的内容。我正在Ubuntu 12.10上运行它。
示例输出:
iter 1 act -6.742e-01 pre 1.191e-02 delta 3.443e-02 f 5.940e-02 |g| 1.730e-01 CG 1
cg reaches trust region boundary
iter 1 act -3.040e-02 pre 5.211e-03 delta 8.607e-03 f 5.940e-02 |g| 1.730e-01 CG 1
cg reaches trust region boundary
iter 1 act 5.453e-04 pre 1.442e-03 delta 6.791e-03 f 5.940e-02 |g| 1.730e-01 CG 1
cg reaches trust region boundary
iter 2 act 6.299e-04 pre 5.985e-04 delta 8.812e-03 f 5.886e-02 |g| 2.525e-01 …Run Code Online (Sandbox Code Playgroud) 我将liblinear与我的程序一起使用,以通过L2R_L2LOSS_SVC_DUAL求解器执行多类分类。在当前的测试设置中,我有来自总共 9 个类的 1600 个实例,每个类有 1000 个特征。
我正在尝试通过 5 倍交叉验证确定用于训练的最佳 C 参数,但即使使用 1.0 liblinear 的小 C 也能达到最大迭代次数:
................................................................................
....................
optimization finished, #iter = 1000
WARNING: reaching max number of iterations
Using -s 2 may be faster (also see FAQ)
Objective value = -637.100923
nSV = 783
Run Code Online (Sandbox Code Playgroud)
该FAQ网站提到了这两个可能的原因:
L2R_L2LOSS_SVC可能会更快。没有一个适用于我的情况。因为我的特征向量是某种直方图,所以有一个自然最大值,我用它来将特征缩放到 [0,1]。
我为 liblinear 设置了参数,如下所示:
struct parameter svmParams;
svmParams.solver_type = L2R_L2LOSS_SVC_DUAL;
svmParams.eps = 0.1;
svmParams.nr_weight = 0;
svmParams.weight_label = NULL; …Run Code Online (Sandbox Code Playgroud) 我对SVM理论不太熟悉,我在python中使用这个LinearSVC类:
http://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVC.html#sklearn.svm.LinearSVC
我想知道惩罚和损失参数之间的区别是什么?
我不理解LIBLINEAR的API中偏差参数的含义.为什么在培训期间由用户指定?它不应该只是从分离超平面到原点的距离,它是学习模型的参数吗?
这来自README:
struct problem
{
int l, n;
int *y;
struct feature_node **x;
double bias;
};
Run Code Online (Sandbox Code Playgroud)
如果bias> = 0,我们假设在每个数据实例的末尾添加了一个附加功能.
这个附加功能是什么?
我经常将实例权重与 Libsvm 结合使用来解决分类问题。 http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/#weights_for_data_instances
有谁知道在 libsvm 中使用实例权重时实现的算法的细节吗?标准 SVM 模型学习算法为所有训练实例分配相同的权重,从而为训练实例的误差分配相同的权重。我相信 Libsvm 使用的算法会有所不同。在网上搜索时,我确实发现了一些做类似事情的论文。例如[1],但我需要与可能确定这一点的人确认。
谢谢!
[1] 杨旭雷,宋青,王悦. “用于数据分类的加权支持向量机。” 国际模式识别和人工智能杂志 21.05 (2007): 961-976。
liblinear ×7
libsvm ×5
svm ×3
python ×2
scikit-learn ×2
c ×1
c++ ×1
data-mining ×1
matlab ×1
r ×1