美文网首页计算机杂谈程序员大数据
【毕设进行时-工业大数据,数据挖掘】LIBSVM 初步测试

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

作者: 张照博 | 来源:发表于2018-04-23 19:33 被阅读84次

    正文之前

    打摆子的日子很快就要一去不复返了。想想有点悲伤。今天做了下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);
        }
    }
    

    正文之后

    溜了。心累~

    到底是谁把天聊死了??

    相关文章

      网友评论

      • tortelee:数据大约是什么规模?
        张照博:@tortelee 估计还要在工业大数据上一条路走到黑
        tortelee:@HustWolf 也还不错,现在还在做什么方向呢?
        张照博:@tortelee 很小的。。就200万条

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

      本文链接:https://www.haomeiwen.com/subject/bvallftx.html