【毕设进行时-工业大数据,数据挖掘】LIBSVM 初步测试

96
HustWolf
2018.04.23 19:33* 字数 296

正文之前

打摆子的日子很快就要一去不复返了。想想有点悲伤。今天做了下LibSVM的初步运用,也写了个从数据库读取数据,然后改造成LibSVM需要的数据格式的类,需要的自取。

正文

这是个从前面的ReadData.java变种来的家伙:

import java.io.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SVMReadData {
    private Object[] Name;
    protected Mysql_Connect mysql=new Mysql_Connect();
    private int rate = 20;
    private static int atoi(String s) {
        return Integer.parseInt(s);
    }
    SVMReadData() throws IOException {
        File file = new File("/Users/zhangzhaobo/IdeaProjects/Graduation_Design/src/New_Data.txt");
        BufferedReader in = new BufferedReader(new FileReader(file));
        String line;  //一行数据作为属性名字
        line = in.readLine();
        in.close();
        Name = line.split("\t\t");
    }

    public String readTrainData() {
        int columnCount=0;
        try {
            mysql.Connect();
            Statement statement=mysql.getStatement();
            String GETCOLUMN="select max(id) from steelplate";
            String getDataQuery="";
            FileWriter svmTrainData = new FileWriter("svmTrainData.txt");
            ResultSet answer = statement.executeQuery(GETCOLUMN);
            if(answer.next())
                columnCount  = answer.getInt(1);
            Object[][] DataTrain = new Object[columnCount/rate*(rate-1)][7];
            int count = 0;
            for (int  i = 0;i<columnCount;++i) {
                if(i%rate != 1) {
                    getDataQuery = ReadData.getSelectQuery(Name, "steelplate", i);
                    ResultSet selectTrainOk;
                    selectTrainOk = statement.executeQuery(getDataQuery);
                    selectTrainOk.next();
                    for (int j = 0; j < 7; ++j) {
                        DataTrain[count][j] = selectTrainOk.getObject((String) Name[j]);
                    }
                    if(atoi((String) DataTrain[count][DataTrain[0].length-1])<6)
                        svmTrainData.write("1 ");
                    else
                        svmTrainData.write("0 ");
                    for (int j = 0; j<DataTrain[0].length-1; ++j ){
                        svmTrainData.write(j+":"+DataTrain[count][j]+" ");
                    }
                    svmTrainData.write("\n");
                    count++;
                }
            }
            svmTrainData.close();
            statement.close();
            mysql.Dis_Connect();
            return "svmTrainData.txt";
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "svmTrainData.txt";
    }

    public String readTestData() {
        int columnCount=0;
        try {
            mysql.Connect();
            Statement statement=mysql.getStatement();
            String GETCOLUMN="select max(id) from steelplate";
            Object[][] DataTest;
            ResultSet answer = statement.executeQuery(GETCOLUMN);
            if(answer.next())
                columnCount  = answer.getInt(1);
            DataTest = new Object[columnCount/rate][7];
            try {
                FileWriter svmTestData = new FileWriter("svmTestData.txt");
                for (int i = 0; i < columnCount; ++i) {
                    if (i % rate == 1) {
                        String getDataQuery = ReadData.getSelectQuery(Name, "steelplate", i);
                        ResultSet selectTestOk;
                        selectTestOk = statement.executeQuery(getDataQuery);
                        selectTestOk.next();
                        for (int j = 0; j < 7; ++j) {
                            DataTest[i / rate][j] = selectTestOk.getObject((String) Name[j]);
                        }
                        if(atoi((String) DataTest[i / rate][DataTest[0].length-1])<6)
                            svmTestData.write("1 ");
                        else
                            svmTestData.write("0 ");
                        for (int j = 0; j < DataTest[0].length - 1; ++j) {
                            svmTestData.write(j + ":" + DataTest[i / rate][j] + " ");
                        }
                        svmTestData.write("\n");
                    }
                }
                svmTestData.close();
            }catch (IOException e){
                e.printStackTrace();
            }
            statement.close();
            mysql.Dis_Connect();
            return "svmTestData.txt";
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return "svmTestData.txt";
    }
}

会得到下面的这种格式的数据存储形式:

1 0:0 1:2 2:11 3:7 4:1 5:80 
1 0:0 1:2 2:11 3:6 4:0 5:200 
1 0:1 1:3 2:13 3:11 4:0 5:70 
1 0:0 1:1 2:6 3:6 4:1 5:120 
1 0:0 1:1 2:11 3:5 4:0 5:40 
1 0:1 1:2 2:11 3:4 4:0 5:70 
1 0:1 1:4 2:13 3:7 4:0 5:90 
1 0:0 1:5 2:11 3:12 4:1 5:100 
1 0:1 1:5 2:14 3:9 4:1 5:70 
1 0:0 1:1 2:7 3:9 4:1 5:70 
1 0:1 1:11 2:18 3:8 4:1 5:70 
1 0:1 1:1 2:6 3:5 4:1 5:70 
1 0:1 1:1 2:11 3:5 4:1 5:70 
1 0:3 1:7 2:21 3:9 4:1 5:70 
1 0:1 1:0 2:6 3:4 4:1 5:70 
1 0:2 1:1 2:11 3:3 4:1 5:70 
1 0:1 1:4 2:13 3:7 4:1 5:70 
1 0:0 1:3 2:11 3:3 4:0 5:175 
1 0:0 1:1 2:6 3:8 4:0 5:40 
1 0:0 1:0 2:5 3:4 4:0 5:40 
1 0:11 1:11 2:36 3:23 4:0 5:40 
1 0:2 1:2 2:13 3:2 4:0 5:40 
1 0:14 1:11 2:31 3:22 4:0 5:40 
1 0:11 1:11 2:34 3:22 4:0 5:40 
1 0:11 1:11 2:31 3:22 4:0 5:40 
1 0:11 1:5 2:24 3:17 4:0 5:40 
1 0:11 1:5 2:25 3:16 4:0 5:40 
1 0:2 1:0 2:11 3:3 4:0 5:40 
1 0:11 1:4 2:23 3:16 4:0 5:40 
1 0:11 1:5 2:26 3:17 4:0 5:40 
1 0:11 1:6 2:27 3:15 4:0 5:40 
1 0:0 1:0 2:0 3:1 4:0 5:40 
1 0:11 1:7 2:27 3:18 4:0 5:40 
1 0:11 1:6 2:26 3:17 4:0 5:40 
1 0:11 1:6 2:26 3:17 4:0 5:40 
1 0:11 1:6 2:26 3:16 4:0 5:40 
1 0:11 1:5 2:23 3:11 4:0 5:40 
1 0:0 1:1 2:8 3:5 4:0 5:50 
1 0:0 1:0 2:0 3:3 4:0 5:50 
1 0:0 1:0 2:1 3:3 4:0 5:50 
1 0:0 1:0 2:1 3:8 4:0 5:50 
1 0:0 1:3 2:11 3:4 4:0 5:40 
1 0:1 1:11 2:17 3:7 4:0 5:100 
1 0:0 1:2 2:11 3:4 4:0 5:100 
1 0:1 1:2 2:12 3:5 4:1 5:70 
1 0:1 1:0 2:6 3:9 4:1 5:60 
1 0:2 1:2 2:13 3:13 4:1 5:60 
1 0:2 1:1 2:12 3:5 4:1 5:60 
1 0:0 1:0 2:5 3:4 4:1 5:70 
1 0:0 1:1 2:6 3:5 4:0 5:40 
1 0:0 1:0 2:5 3:5 4:1 5:100 
1 0:0 1:2 2:8 3:5 4:1 5:80 
1 0:0 1:0 2:2 3:5 4:1 5:100 
1 0:3 1:3 2:17 3:24 4:1 5:70 
1 0:1 1:4 2:12 3:6 4:0 5:40 
1 0:0 1:1 2:5 3:4 4:0 5:185 
1 0:1 1:4 2:13 3:14 4:0 5:100 
1 0:1 1:1 2:11 3:9 4:1 5:80 
1 0:2 1:2 2:12 3:5 4:1 5:80 
1 0:0 1:3 2:11 3:8 4:1 5:70 
1 0:2 1:1 2:11 3:5 4:1 5:80 
1 0:1 1:3 2:13 3:8 4:1 5:80 
1 0:2 1:4 2:17 3:10 4:0 5:40 
1 0:1 1:2 2:12 3:16 4:1 5:200 
0 0:1 1:4 2:13 3:7 4:1 5:80 
0 0:0 1:2 2:11 3:6 4:0 5:200 
0 0:2 1:1 2:11 3:4 4:0 5:40 
0 0:0 1:1 2:5 3:7 4:0 5:40 
0 0:3 1:4 2:21 3:14 4:0 5:40 
0 0:12 1:1 2:21 3:7 4:1 5:100 
0 0:1 1:1 2:11 3:6 4:1 5:80 
0 0:1 1:1 2:11 3:3 4:1 5:70 
0 0:0 1:1 2:5 3:6 4:1 5:100 
0 0:1 1:2 2:11 3:7 4:0 5:40 
0 0:1 1:4 2:13 3:4 4:0 5:300 
0 0:1 1:5 2:15 3:6 4:0 5:300 
0 0:1 1:12 2:21 3:23 4:0 5:70 
0 0:1 1:2 2:12 3:8 4:0 5:40 
0 0:1 1:0 2:3 3:3 4:0 5:180 
0 0:1 1:11 2:19 3:9 4:1 5:80 
0 0:1 1:7 2:17 3:8 4:1 5:100 
0 0:1 1:3 2:12 3:7 4:1 5:70 
0 0:1 1:1 2:11 3:4 4:0 5:40 
0 0:1 1:1 2:11 3:9 4:1 5:80 
0 0:1 1:4 2:12 3:4 4:0 5:40 
0 0:1 1:2 2:11 3:3 4:0 5:220 
0 0:0 1:2 2:11 3:4 4:0 5:40 
0 0:2 1:2 2:12 3:2 4:0 5:40 
0 0:3 1:2 2:15 3:8 4:1 5:70 
0 0:2 1:1 2:12 3:4 4:0 5:40 
0 0:1 1:1 2:6 3:4 4:1 5:300 
0 0:0 1:11 2:15 3:7 4:0 5:40 
0 0:3 1:0 2:11 3:4 4:0 5:100 
0 0:1 1:1 2:8 3:14 4:1 5:70 
0 0:2 1:1 2:7 3:6 4:1 5:69 
0 0:1 1:0 2:6 3:7 4:1 5:143 
0 0:3 1:2 2:13 3:5 4:0 5:40 
libSVM的数据格式

Label index:value index:value ….

  • Label:是类别的标识.如果是回归,这是目标值,就要实事求是了。

  • Index: 是属性序号,记住给整数啊,我给了个属性名字简直就GG了。

  • Value:就是要训练的数据,从分类的角度来说就是特征值,数据之间用空格隔开,比如: -15 1:0.708 2:1056 3:-0.3333
    需要注意的是,如果特征值为0,特征冒号前面的(姑且称做序号)可以不连续。如:-15 1:0.708 3:-0.3333

下面是主函数的入口:

import java.io.IOException;

public class ZZB_SVM {
    public static void main() throws IOException {
        SVMReadData sr = new SVMReadData();
        String trainFileName = sr.readTrainData();
        String testFileName = sr.readTestData();
        String[] arg = { trainFileName, //训练集
                "model.txt" }; // 存放SVM训练模型

        String[] parg = { testFileName, //测试数据
                "model.txt", // 调用训练模型
                "predict.txt" }; //预测结果
        System.out.println("........SVM运行开始..........");
        long start=System.currentTimeMillis();
        svm_train.main(arg); //训练
        System.out.println("用时:"+(System.currentTimeMillis()-start));
        //预测
        svm_predict.main(parg);
    }
}

正文之后

溜了。心累~

到底是谁把天聊死了??
计算机从入门到***
Web note ad 1