JAVA-ML中封装了java开源支持向量机的库。LibSVM是台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量机的库,这套库运算速度还是挺快的,可以很方便的对数据做分类或回归。由于LibSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。
经过Java-ML项目使得LibSVM更易使用,避免了一些不必要参数的输入。
https://www.csie.ntu.edu.tw/~cjlin/
我这采用java进行,所以需要用到的是java,目录如下
将java目录导入项目
进行手工绘制数据并保存数据
我的文件名为mode.txt
String filepath = "I:\\IOT\\project\\SVM\\src\\file\\";//自己选择路径 //train String[] arg = {"-s","0","-c","10","-t","0",filepath+"model.txt",filepath+"line.txt"}; System.out.println("----------------线性-----------------"); //训练函数 svm_train.main(arg); arg[5]="1"; arg[7]=filepath+"poly.txt";//输出文件路径 System.out.println("---------------多项式-----------------"); svm_train.main(arg); arg[5]="2"; arg[7]=filepath+"RBF.txt"; System.out.println("---------------高斯核-----------------"); svm_train.main(arg);
说明:
svm-train
用法: svmtrain [options] training_set_file [model_file]
options为操作参数
-s 设置svm类型:默认值为0
0 – C-SVC
1 – v-SVC
2 – one-class-SVM
3 –ε-SVR
4 – n - SVR
-t 设置核函数类型,默认值为2
0 --线性核:u’v
1 --多项式核:(gu’v+coef0)degree
2 – RBF核:exp(-γ||u-v||2)
3 – sigmoid核:tanh(γ*u’*v+coef0)
-d degree:设置多项式核中degree的值,默认为3
-gγ:设置核函数中γ的值,默认为1/k,k为特征(或者说是属性)数;
-r coef 0:设置核函数中的coef 0,默认值为0;
-c cost:设置C-SVC、ε-SVR、n - SVR中从惩罚系数C,默认值为1;
-n v:设置v-SVC、one-class-SVM与n - SVR中参数n,默认值0.5;
-pε:设置v-SVR的损失函数中的e,默认值为0.1;
-m cachesize:设置cache内存大小,以MB为单位,默认值为40;
-eε:设置终止准则中的可容忍偏差,默认值为0.001;
-h shrinking:是否使用启发式,可选值为0或1,默认值为1;
-b概率估计:是否计算SVC或SVR的概率估计,可选值0或1,默认0;
-wi weight:对各类样本的惩罚系数C加权,默认值为1;
-v n:n折交叉验证模式;
model_file:可选项,为要保存的结果文件,称为模型文件,以便在预测时使用。
为了能保存结果,还是要提供一个结果文件名如line.txt,poly.txt,RBF.txt
说明:
#iter为迭代次数,
nu 与前面的操作参数-n nu 相同,
obj为SVM文件转换为的二次规划求解得到的最小值,
rho 为判决函数的常数项b,
nSV 为支持向量个数,
nBSV为边界上的支持向量个数,
Total nSV为支持向量总个数。
结果文件中数据以RBF核为例
说明:
svm_type c_svc % 训练所采用的svm类型,此处为C- SVC
kernel_type rbf %训练采用的核函数类型,此处为RBF核
gamma 0.0769231 %设置核函数中的g ,默认值为1/ k
nr_class 2 %分类时的类别数,此处为两分类问题
total_sv 132 %总共的支持向量个数
rho 0.424462 %决策函数中的常数项b
label 1 -1%类别标签
nr_sv 64 68 %各类别标签对应的支持向量个数
SV %以下为支持向量
上面的数据是和训练数据属于同一类型的,即已经知道类别,通过将其作为模拟的待预测数据来验证分类模型的准确度。
2. 代码
String filepath = "I:\\IOT\\project\\SVM\\src\\file\\";//自己选择路径 //predict String[] arg1={filepath+"test.txt",filepath+"line.txt",filepath+"line_res.txt"}; System.out.println("----------------线性-----------------"); //预测函数 svm_predict.main(arg1); arg1[1]=filepath+"poly.txt"; //输入文件模型路径 arg1[2]=filepath+"poly-res.txt";//输出文件结果路径 System.out.println("---------------多项式-----------------"); svm_predict.main(arg1); arg1[1]=filepath+"RBF.txt"; arg1[2]=filepath+"RBF_res.txt"; System.out.println("---------------高斯核-----------------"); svm_predict.main(arg1);
说明:
svm-predict的用法
svm-predict是根据训练获得的模型,对数据集合进行预测。
用法:svmpredict [options] test_file model_file output_file
其中,options为操作参数,可用的选项即表示的涵义如下所示:
-b probability_estimates——是否需要进行概率估计预测,可选值为0或者1,默认值为0。
model_file ——是由svmtrain产生的模型文件;
test_file——是要进行预测的数据文件,格式也要符合libsvm格式,即使不知道label的值,也要任意填一个,svmpredict会在output_file中给出正确的label结果,如果知道label的值,就会输出正确率;
output_file ——是svmpredict的输出文件,表示预测的结果值。
结果文件以line_res.txt为例
https://blog.csdn.net/chl033/article/details/4645544
https://blog.csdn.net/taohuaxinmu123/article/details/20370525