java实现实时svm预测

支持向量机(svm)是一种常见的算法,但在工业现场中,我们不可能把实验室的笔记本带入现场进行算法测试,因此有必要做一套实时的测量预测系统,这里通过socket通信来仿照实时的产生数据进行了模拟,实现了java实时处理数据的能力

1.用历史数据训练模型,

2.保存模型,

3通过udp协议进行实时传输数据

4.进行预测分析

这里展示一个简单的实例代码:

UDP服务端

package com.hemin.utp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.DecimalFormat;
import java.util.Random;
import java.util.Timer;

import com.sun.xml.internal.ws.resources.SenderMessages;

public class UDPServer {

	public static void main(String[] args) throws IOException, InterruptedException{
		while(true){
			UDPServer us = new UDPServer();
			us.sendMessage();
			Thread.sleep(5000);
		}
	}
	public void sendMessage() throws IOException {
		DatagramSocket socket =new DatagramSocket(9994);
		String str = randString();
		DatagramPacket pack = new DatagramPacket(str.getBytes(), 0,str.length(),InetAddress.getLocalHost(),9995);
		socket.send(pack);
		socket.close();
		socket.close();
	}
	public String randString(){
		float [] arra ={-10,-9,-8,-7,-6,0,1,2,3,4,5,6,7,8,9}; 
		float [] arrb = {-1,0};
		Random rand = new Random();
		int a  = rand.nextInt(10);
		int b  = rand.nextInt(2);
		DecimalFormat df = new DecimalFormat("0.00");
		String f1 = df.format(arra[a]);
		String f2 = df.format(arrb[b]);
		String str = f1+","+f2;
		return str;
	}
}

svm测试类,实现了接受数据,训练模型,处理数据等功能

package com.hemin.lssvm;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.LinkedList;

import libsvm.svm;
import libsvm.svm_model;
import libsvm.svm_node;
import libsvm.svm_parameter;
import libsvm.svm_problem;

public class SvmTest {

	public static void main(String[] args) throws IOException, InterruptedException {
		SvmTest st = new SvmTest();//实例化
		svm_model model = null;
		if(st.haveModel()){
			model = svm.svm_load_model("d://model");
			System.out.println("加载已有模型");
		}else{
			model = st.model();
		}
		LinkedList<String> list = new LinkedList<>();
		//循环得到一组数据
		int i =0;
		while(true){
			System.out.println("now is "+i++);
			String str = st.recieve();
			Thread.sleep(5000);
			list.add(str);
			if(list.size()==2){
				float a = Float.parseFloat(list.getFirst().split(",")[0]);
				int b = (int)Float.parseFloat(list.getFirst().split(",")[1]);
				float c = Float.parseFloat(list.getLast().split(",")[0]);
				int d = (int)Float.parseFloat(list.getLast().split(",")[1]);
				System.out.println(a+"   "+b+"   "+c+"    "+d);
				list.removeFirst();
				st.makeNode(b, a, d, c);
				System.out.println("预测值为"+svm.svm_predict(model, st.makeNode(b, a, d, c)));
			}
		}
	}
	//建模
	public svm_model model() throws IOException{
		svm_node pa0 = new svm_node();
		pa0.index = 0;
		pa0.value = 10.0;
		svm_node pa1 = new svm_node();
		pa1.index = -1;
		pa1.value = 10.0;
		svm_node pa2 = new svm_node();
		pa2.index = 0;
		pa2.value = -10.0;
		svm_node pa3 = new svm_node();
		pa3.index = 0;
		pa3.value = -10.0;
		
		//make svm_node
		svm_node [] pa= {pa0 , pa1};
		svm_node [] pb= {pa2 , pa3};
		
		svm_node[][] datas = {pa,pb};
		
		double [] lables = {1.0,-1.0};
		
		svm_problem problem = new svm_problem();
		problem.l = 2;
		problem.x = datas;
		problem.y = lables;
		
		svm_parameter parameter = new svm_parameter();
		parameter.svm_type = svm_parameter.C_SVC;
		parameter.kernel_type = svm_parameter.RBF;
		parameter.cache_size = 100;
		parameter.eps = 0.00001;
		parameter.C=1;
		
		System.out.println(svm.svm_check_parameter(problem, parameter));
		
		svm_model model = svm.svm_train(problem, parameter);
		
		//predict
		svm_node pc0 = new svm_node();
		pc0.index = 0;
		pc0.value = -0.1;
		svm_node pc1 = new svm_node();
		pc1.index = -1;
		pc1.value = -0.1;
		svm_node[] pc = {pc0, pc1};
		System.out.println(svm.svm_predict(model, pc));
		svm.svm_save_model("d:\\model", model);
		return model;
	}
	//模仿实时数据库
	public String  recieve () throws IOException, InterruptedException{
		DatagramSocket socket = new DatagramSocket(9995);
		DatagramPacket pack = new DatagramPacket(new byte[1024], 1024);
		socket.receive(pack);
		String str = new String(pack.getData());
		socket.close();
		socket.close();
		return str;
	}
	//测试数据
	public  svm_node[] makeNode(int a,float b,int c,float d){
		svm_node pc0 = new svm_node();
		pc0.index = a;
		pc0.value = b;
		svm_node pc1 = new svm_node();
		pc1.index = c;
		pc1.value = d;
		svm_node[] pc = {pc0, pc1};
		return pc;
	}
	//判断本地是否有模型
	public boolean haveModel(){
		File f =new File("d://model");
		boolean have = f.exists();
		if(have){
			return true;
		}else{
			return false;
		}
	}
}



  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
1、下载并安装mysql,将脚本执行至数据库中; 2、配置java环境,使用jdk8,配置环境变量,下载IntelliJ IDEA 2019.2.4,该工具为java代码编译器 3、下载Maven,配置至环境变量(百度搜索很多),将构建器为Maven,类库配置成阿里库(方法:百度搜索很多很多) 4、将工程导入后,在application-local.yml文件中配置数据库 5、在logback-prod.xml文件中配置log日志 6、配置完毕后,即可启动 访问地址:http://localhost:8082/anime/login.html 用户名:admin 密码:admin V:china1866 1、 登录 2、 首页 3、 权限管理-用户管理 4、 权限管理-添加用户数据 5、 交通数据管理-查看交通数据 6、 交通数据管理-添加交通数据 7、 交通预测-交通数据预测 脚本: CREATE TABLE `traffic_data_t` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '序列', `trafficId` VARCHAR(50) NULL DEFAULT NULL COMMENT '交通数据编号', `trafficContent` VARCHAR(50) NULL DEFAULT NULL COMMENT '交通状况', `trafficSection` VARCHAR(200) NULL DEFAULT NULL COMMENT '交通路段', `trafficMan` VARCHAR(200) NULL DEFAULT NULL COMMENT '上报人', `trafficDate` VARCHAR(200) NULL DEFAULT NULL COMMENT '上报时间', `status` VARCHAR(200) NULL DEFAULT NULL COMMENT '交通状态', PRIMARY KEY (`id`) ) COMMENT='交通数据表' COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=44 ; CREATE TABLE `sys_user_t` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `role_id` INT(11) NULL DEFAULT NULL COMMENT '角色ID', `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', `user_name` VARCHAR(100) NOT NULL COMMENT '用户名', `status` INT(11) NOT NULL COMMENT '是否有效0:false\\\\1:true', `create_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `create_by` VARCHAR(100) NULL DEFAULT NULL, `last_update_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `last_update_by` VARCHAR(100) NULL DEFAULT NULL, `password` VARCHAR(128) NOT NULL, `tenantcode` VARCHAR(50) NOT NULL, `diskId` VARCHAR(500) NULL DEFAULT NULL, `remarks` VARCHAR(500) NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COMMENT='系统用户表' COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=51 ; CREATE TABLE `sys_role_t` ( `role_id` INT(11) NOT NULL COMMENT '角色ID', `role_name` VARCHAR(200) NOT NULL COMMENT '权限名称', `status` INT(11) NOT NULL COMMENT '是否有效0:true\\\\1:false', `create_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `create_by` VARCHAR(100) NULL DEFAULT NULL, `last_update_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `last_update_by` VARCHAR(100) NULL DEFAULT NULL ) COMMENT='系统角色表' COLLATE='utf8_general_ci' ENGINE=InnoDB ; CREATE TABLE `sys_menu_t` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '序列', `parent_id` VARCHAR(50) NOT NULL COMMENT '父节点ID', `menu_id` VARCHAR(50) NOT NULL COMMENT '菜单ID', `menu_name` VARCHAR(200) NOT NULL COMMENT '菜单名称', `menu_url` VARCHAR(200) NULL DEFAULT NULL COMMENT '菜单URL', `status` INT(11) NOT NULL COMMENT '有效(0有效,1失效)', `create_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `create_by` VARCHAR(200) NULL DEFAULT NULL, `last_update_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `last_update_by` VARCHAR(200) NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COMMENT='菜单表' COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=33 ; CREATE TABLE `sys_menu_role_relation_t` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '序列', `menu_id` VARCHAR(50) NOT NULL COMMENT '菜单ID', `role_id` VARCHAR(50) NOT NULL COMMENT '角色ID', `status` INT(11) NOT NULL COMMENT '有效(0有效,1失效)', `create_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `create_by` VARCHAR(200) NULL DEFAULT NULL, `last_update_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `last_update_by` VARCHAR(200) NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COMMENT='角色与菜单关系表' COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=51 ;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值