基于LibSVM支持向量机并获取决策函数
一、LibSVM简介
- LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包。
- LIBSVM不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
二、LibSVM下载及安装
- 官网下载地址:https://www.csie.ntu.edu.tw/~cjlin/libsvm/
- 文件解压缩
文件中包含多种语言的代码,根据需要进行调用
三、构建数据集并获得决策函数
实例
from libsvm.python.svmutil import *
y, x = [1,-1], [{1:1, 2:1}, {1:-1,2:-1}] # 输入的数据
options = '-t 0 -c 4 -b 1' # 训练参数设置
model = svm_train(y,x,options) # 进行训练
yt = [1]
xt = [{1:1, 2:1}]
p_label, p_acc, p_val = svm_predict(yt, xt, model) # 使用得到的模型进行预测
print(p_label)
- 说明
x: 输入的样本的属性值,其中每一个样本的格式是一个字典类型,键值对中键是一个索引值,值是对应的数据属性值
options: 训练的一些参数设置,主要有以下的一些设置
-s SVM的类型(svm_type)
0 -- C-SVC(默认) 使用惩罚因子(Cost)的处理噪声的多分类器
1 -- nu-SVC(多分类器) 按照错误样本比例处理噪声的多分类器
2 -- one-class SVM 一类支持向量机,可参见"SVDD"的相关内容
3 -- epsilon-SVR(回归) epsilon支持向量回归 (也就是使用 E-不敏感损失函数进行回归)
4 -- nu-SVR(回归)
-t 核函数类型(kernel_type)
0 -- linear(线性核): u'*v
1 -- polynomial(多项式核): (gamma*u'*v + coef0)^degree
2 -- radial basis function(RBF,径向基核/高斯核): exp(-gamma*|u-v|^2)
3 -- sigmoid(S型核): tanh(gamma*u'*v + coef0)
4 -- precomputed kernel(预计算核): 核矩阵存储在training_set_file中
下面是调整SVM或核函数中参数的选项:
-d 调整核函数的degree参数,默认为3
-g 调整核函数的gamma参数,默认为1/num_features
-r 调整核函数的coef0参数,默认为0
-c 调整C-SVC, epsilon-SVR 和 nu-SVR中的Cost参数,默认为1(就是优化问题中的那个C)
-n 调整nu-SVC, one-class SVM 和 nu-SVR中的错误率nu参数,默认为0.5
-p 调整epsilon-SVR的loss function中的epsilon参数,默认0.1
-m 调整内缓冲区大小,以MB为单位,默认100
-e 调整终止判据,默认0.001
-wi 调整C-SVC中第i个特征的Cost参数
调整算法功能的选项:
-b 是否估算正确概率,取值0 - 1,默认为0
-h 是否使用收缩启发式算法(shrinking heuristics),取值0 - 1,默认为0
-v 交叉校验
-q 静默模式
- 启动LibSVM
- 点击
Windows
文件下,启动svm-toy.exe
- 点击
- 手工绘制数据集
- 鼠标左键进行描点
change
切换继续绘制点
Save
将数据保存为train.txt
- 新建一组数据集作为测试集test.txt
- IDEA新建Java项目
- 将Java文件夹下libsvm文件夹拷贝到项目src下
- 新建Test类,并把指定文件添加到包内
- 新建Test类,并添加代码
package test;
import java.io.IOException;
public class Test {
public static void main(String args[]) throws IOException {
//存放数据以及保存模型文件路径
String filepath = "D:\\python\\libsvm-3.25\\x\\";
/*
* -s 设置svm类型:默认值为0
* 0– C-SVC
* 1 – v-SVC
* 2 – one-class-SVM
* 3 –ε-SVR
* 4 – n - SVR
*
* -t 设置核函数类型,默认值为2
* 0 --线性核
* 1 --多项式核
* 2 -- RBF核
* 3 -- sigmoid核
*
* -d degree:设置多项式核中degree的值,默认为3
*
* -c cost:设置C-SVC、ε-SVR、n - SVR中从惩罚系数C,默认值为1;
*/
String[] arg = {"-s","0","-c","10","-t","0",filepath+"train.txt",filepath+"line.txt"};
String[] arg1 = {filepath+"test.txt",filepath+"line.txt",filepath+"predict1.txt"};
System.out.println("----------------线性-----------------");
//训练函数
svm_train.main(arg);
svm_predict.main(arg1);
arg[5]="1";
arg[7]=filepath+"poly.txt";//输出文件路径
arg1[1]=filepath+"poly.txt";
arg1[2]=filepath+"predict2.txt";
System.out.println("---------------多项式-----------------");
svm_train.main(arg);
svm_predict.main(arg1);
arg[5]="2";
arg[7]=filepath+"RBF.txt";
arg1[1]=filepath+"RBF.txt";
arg1[2]=filepath+"predict3.txt";
System.out.println("---------------高斯核-----------------");
svm_train.main(arg);
svm_predict.main(arg1);
}
}
输出参数说明
- optimization finished,#iter = //迭代次数
- nu = //核函数的参数
- obj = , rho =
//obj是SVM转换为的二次规划求解得到的最小值对偶题的最优目标值,rho是决策函数//sgn(w^x-rho)中的偏差项(也是b,wx+b)。- nSV = , nBSV = //nSV是支持向量的个数,nBSV是边界上支持向量的个数
- Total nSV = //支持向量的总的个数
- Accuracy = //精度
- 输出文件
- data.txt训练数据
- line.txt线性模型
- poly多项式模型
- RBF高斯核模型
- 数据说明
- svm_type //所选择的svm类型,默认为c_svc
- kernel_type //训练采用的核函数类型
- gamma //RBF核的参数γ
- total_sv //支持向量总个数
- rho //判决函数的偏置项b
- label //原始文件中的类别标识
- nr_sv //每个类的支持向量机的个数
- SV //各个类的权系数及相应的支持向量
- nr_class //类别数
- 线性模型
- 多项式模型
- 高斯核模型
- 决策函数
根据公式 f ( x ) = w T ∗ x + b f(x)=w^T*x+b f(x)=wT∗x+b以及模型数据可以求得最终的决策函数。
- w T w^T wT为向量的转置矩阵,即为模型数据中的SV
- b b b为偏置常数,即为数据模型中的rho
四、总结
- libSVM的训练其实就是,搜集样本->标记label->提取特征->写特征文件->调用train.exe->得到model
- model可以用来判断新的未知label的特征到底应该属于哪一个label
五、参考
基于LibSVM得到决策函数
【机器学习】基于LIBSVM实现支持向量机核函数训练并获取决策函数
LIBSVM ( 二 ) 参数实例详解