支持向量机(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;
}
}
}