二、原生态libsvm算法的学习
Libsvm原生态的方法对数值类型的特征可以处理,但是分类类型的特征则目前无法处理,所以我们需要手动的去处理分类变量。
如红、黄、蓝属于颜色的分类,那么可以分别用三个字段来表示,如:
1,0,0
0,1,0
0,0,1
原生态的代码如下:
package com.xws.myTest; import libsvm.svm; import libsvm.svm_model; import libsvm.svm_node; import libsvm.svm_parameter; import libsvm.svm_problem; public class Test1 { public static void main(String[] args) { //准备样本数据 double[][] data = { { 7, 122.33, 20.98, 1342 }, { 7, 119.80, 20.38, 1213 }, { 8, 125.34, 22.98, 1496 }, { 8, 125.28, 22.48, 1354 }, { 9, 130.44, 25.08, 1972 }, { 9, 130.46, 25.07, 1516 }, { 10, 135.03, 27.47, 1843 }, { 10, 136.06, 27.54, 1685 }, { 11, 139.82, 29.93, 2010 }, { 11, 142.63, 31.52, 1883 }, { 12, 145.45, 33.56, 2200 }, { 12, 148.03, 35.37, 2077 } }; svm_node[][] datas = new svm_node[12][]; for (int i = 0; i < data.length; i++) { double[] data_i = data[i]; svm_node[] nodes = new svm_node[data_i.length]; for (int j = 0; j < data_i.length; j++) { svm_node node = new svm_node(); node.index = j; node.value = data_i[j]; nodes[j] = node; } datas[i] = nodes; } double[] lables = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }; // a,b // 对应的lable // 定义svm_problem对象 svm_problem problem = new svm_problem(); problem.l = 12; // 向量个数 problem.x = datas; // 训练集向量表 problem.y = lables; // 对应的lable数组 // 定义svm_parameter对象 svm_parameter param = new svm_parameter(); param.svm_type = svm_parameter.C_SVC; param.kernel_type = svm_parameter.LINEAR; param.cache_size = 100; param.eps = 0.00001; param.C = 1; // 训练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分类模型 //定义测试数据 svm_node n1 = new svm_node(); svm_node n2 = new svm_node(); svm_node n3 = new svm_node(); svm_node n4 = new svm_node(); n1.index = 0; n1.value = 12; n2.index = 1; n2.value = 148.03; n3.index = 2; n3.value = 35.37; n4.index = 3; n4.value = 2377; svm_node[] pc = { n1, n2, n3, n4 }; // 预测测试数据的lable System.out.println(svm.svm_predict(model, pc)); } /* * null * * optimization finished, #iter = 1 nu = 0.0033333333333333335 obj = * -0.0033333333333333335, rho = 0.0 nSV = 2, nBSV = 0 Total nSV = 2 -1.0 * * 第一行null是svm.svm_check_parameter(problem, * param)的输出,表示参数设置无误;最后一行的-1.0表示对c点的预测lable是-1.0。 * * 要注意的几点是: 1. * 主要用了svm.svm_train()做训练,用svm.svm_predict()做预测,其中用到了svm_problem * 、svm_parameter、svm_model、svm_node几种“结构体”对象。 2. * svm_node表示的是{向量的分量序号,向量的分量值 * },很多稀疏矩阵均用此方法存储数据,可以节约空间;svm_node[]则表示一个向量,一个向量的最后一个分量的svm_node * .index用-1表示;svm_node[][]则表示一组向量,也就是训练集。 */ }

浙公网安备 33010602011771号