svmlib java_Libsvm Java
在java环境下用Libsvm包解决一个多分类问题。
1、将训练数据和测试数据按照libsvm的数据格式存放
可以写程序直接构造,libsvm的数据格式如下
Label 1:value 2:value ….
其中1、2是特征的序号,后面跟的是该特征值。当特征值为0的时候,可以省略不写,也就是说特征序号可以不连续。如-15 1:0.708 3:-0.3333.....
2、用svm-scale对数据进行归一化处理
之前一直训练失败的原因主要是没有对数据进行缩放,svm-scale.exe在libsvm包里windows文件夹里,作用是对数据进行缩放,防止某个特征过大或过小,从而在训练中起的作用不平衡。
下图是可选参数,-l后面跟数据归一化的下界,-u后面跟数据归一化的上界。
具体用法
这里设置的归一化上下界为0和1,svmTrainData.txt是原始训练数据,将缩放后的数据保存到train.scale。
注意训练数据和测试数据都要做归一化处理。
3、用网格搜索(grid search)寻找最优参数
libsvm包的tools文件夹下有一个grid.py文件,可以对训练数据进行参数寻优。
先介绍一下svm_train的各项可选参数:
-s svm类型:SVM设置类型(默认0)
0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 – 线性核函数:u’v
1 – 多项式核函数:(r*u’v + coef0)^degree
2 – RBF(径向基)核函数:exp(-r|u-v|^2)
3 – sigmoid核函数:tanh(r*u’v + coef0)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
-p p:设置e -SVR 中损失函数p的值(默认0.1)
-m cachesize:设置cache内存大小,以MB为单位(默认40)
-e eps:设置允许的终止判据(默认0.001)
-h shrinking:是否使用启发式,0或1(默认1)
-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
网格寻优找的主要是最优的gamma和cost。在使用grid.py之前得先装一个绘图工具gnuplot。具体使用方法可以参考博客https://blog.csdn.net/u014772862/article/details/51829727
4、训练和测试
获得归一化的数据以及找到最优参数后就可以进行svm训练了。训练和测试的java代码很简单:
public static void main(String[] args) throws IOException {
String[] arg = {"-c","2.0","-g","0.03125","D:/MnistDatabase/svm/train.scale","D:/MnistDatabase/svm/svmModel.txt" };
String[] parg = {"D:/MnistDatabase/svm/test.scale","D:/MnistDatabase/svm/svmModel.txt" ,"D:/MnistDatabase/svm/svmPredict.txt"};
System.out.println(".........svm运行开始.........");
svm_train t = new svm_train();
svm_predict p= new svm_predict();
t.main(arg);
p.main(parg);
}
svmModel.txt存放的是训练好的svm模型,模型中各参数的意义可以参考这篇博客https://blog.csdn.net/zhaoluruoyan89/article/details/78342101
svmlib java_Libsvm Java相关推荐
- springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据
SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...
- Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几
Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...
- 在k8s中使用gradle构建java web项目镜像Dockerfile
在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...
- Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常
kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...
- SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos
SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...
- OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3
OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...
- Gradle错误提示:Java home supplied via ‘xxx.xxx.xxx‘ is invalid
Gradle错误提示:Java home supplied via 'org.gradle.java.home' is invalid 描述:在使用idea采用gradle进行依赖的管理功能,当想切换 ...
- 查看Hotspot源码,查看java各个版本源码的网站,如何查看jdk源码
java开发必知必会之看源码,而看源码的第一步则是找到源码
- java基本类型转换,随记
java基本类型转换: double double 转 long double random = Math.round(Math.random()*10000); long l = new Doubl ...
最新文章
- 特斯拉AI总监:我复现了LeCun 33年前的神经网络,发现和现在区别不大
- python3 处理 html转义字符
- 【学习笔记 】sass教程巩固学习
- 【算法竞赛学习】资金流入流出预测-挑战Baseline_特征工程
- 一个42KB的文件,解压完其实是个4.5PB的“炸弹”
- html 属于mvvm框架,前端MVVM框架avalon揭秘 - HTML编译器
- java 自定义map_自定义写实现java中map中的功能(简易)
- php http_user_agent 微信浏览器改变为其他浏览器,微信内置浏览器HTTP_USER_AGENT
- window2008 64位系统无法调用Microsoft.Office.Interop组件进行文件另存的解决办法
- 朴素贝叶斯算法+模型的评价-查准率、召回率、F1-score及混淆矩阵(code实现)
- 气泡shader_仿蚂蚁森林气泡
- 2022年全国计算机二级Access数据库程序设计模拟试题及答案
- Mac OSX安装MongoDB
- 有限差分法求解高阶导数
- 汉思新材料:无人机控制板BGA芯片底部填充胶应用
- Go语言核心之美 2.5-字符串
- 琴生不等式(Jensen Inequality)
- 王思聪数字时钟android安卓/ios苹果下载
- 【计算机网络】分组交换和电路交换
- 简单常用JS函数集合大全107个