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;
		}
	}
}



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值