二、原生态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[][]则表示一组向量,也就是训练集。
     */

}

 

posted @ 2016-08-05 17:23  博智星  Views(221)  Comments(0)    收藏  举报