libsvm java 实例_libsvm支持向量机回归示例

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.List;

import libsvm.svm;

import libsvm.svm_model;

import libsvm.svm_node;

import libsvm.svm_parameter;

import libsvm.svm_problem;

public class SVM {

public static void main(String[] args) {

// 定义训练集点a{10.0, 10.0} 和 点b{-10.0, -10.0},对应lable为{1.0, -1.0}

List label = new ArrayList();

List nodeSet = new ArrayList();

getData(nodeSet, label, "file/train.txt");

int dataRange=nodeSet.get(0).length;

svm_node[][] datas = new svm_node[nodeSet.size()][dataRange]; // 训练集的向量表

for (int i = 0; i < datas.length; i++) {

for (int j = 0; j < dataRange; j++) {

datas[i][j] = nodeSet.get(i)[j];

}

}

double[] lables = new double[label.size()]; // a,b 对应的lable

for (int i = 0; i < lables.length; i++) {

lables[i] = label.get(i);

}

// 定义svm_problem对象

svm_problem problem = new svm_problem();

problem.l = nodeSet.size(); // 向量个数

problem.x = datas; // 训练集向量表

problem.y = lables; // 对应的lable数组

// 定义svm_parameter对象

svm_parameter param = new svm_parameter();

param.svm_type = svm_parameter.EPSILON_SVR;

param.kernel_type = svm_parameter.LINEAR;

param.cache_size = 100;

param.eps = 0.00001;

param.C = 1.9;

// 训练SVM分类模型

System.out.println(svm.svm_check_parameter(problem, param));

// 如果参数没有问题,则svm.svm_check_parameter()函数返回null,否则返回error描述。

svm_model model = svm.svm_train(problem, param);

// svm.svm_train()训练出SVM分类模型

// 获取测试数据

List testlabel = new ArrayList();

List testnodeSet = new ArrayList();

getData(testnodeSet, testlabel, "file/test.txt");

svm_node[][] testdatas = new svm_node[testnodeSet.size()][dataRange]; // 训练集的向量表

for (int i = 0; i < testdatas.length; i++) {

for (int j = 0; j < dataRange; j++) {

testdatas[i][j] = testnodeSet.get(i)[j];

}

}

double[] testlables = new double[testlabel.size()]; // a,b 对应的lable

for (int i = 0; i < testlables.length; i++) {

testlables[i] = testlabel.get(i);

}

// 预测测试数据的lable

double err = 0.0;

for (int i = 0; i < testdatas.length; i++) {

double truevalue = testlables[i];

System.out.print(truevalue + " ");

double predictValue = svm.svm_predict(model, testdatas[i]);

System.out.println(predictValue);

err += Math.abs(predictValue - truevalue);

}

System.out.println("err=" + err / datas.length);

}

public static void getData(List nodeSet, List label,

String filename) {

try {

FileReader fr = new FileReader(new File(filename));

BufferedReader br = new BufferedReader(fr);

String line = null;

while ((line = br.readLine()) != null) {

String[] datas = line.split(",");

svm_node[] vector = new svm_node[datas.length - 1];

for (int i = 0; i < datas.length - 1; i++) {

svm_node node = new svm_node();

node.index = i + 1;

node.value = Double.parseDouble(datas[i]);

vector[i] = node;

}

nodeSet.add(vector);

double lablevalue = Double.parseDouble(datas[datas.length - 1]);

label.add(lablevalue);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值