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