4

我正在尝试操作 liblinear 库(java),并且我正在使用带有此处找到的模板的超级简单示例。案例示例是确定形状是正方形还是矩形。

这是我的代码:

import java.io.File;
import java.io.IOException;

import de.bwaldvogel.liblinear.Feature;
import de.bwaldvogel.liblinear.FeatureNode;
import de.bwaldvogel.liblinear.Linear;
import de.bwaldvogel.liblinear.Model;
import de.bwaldvogel.liblinear.Parameter;
import de.bwaldvogel.liblinear.Problem;
import de.bwaldvogel.liblinear.SolverType;

public class Main {

    static int NUM_OF_TS_EXAMPLES = 8;

    // 1 = square, -1 = non-square
    static double[] GROUPS_ARRAY = {1, 1, 1, 1, -1, -1, -1, -1};

    // squares
    static FeatureNode[] shape1 = {new FeatureNode(1, 2), new FeatureNode(2, 2)};
    static FeatureNode[] shape2 = {new FeatureNode(1, 4), new FeatureNode(2, 4)};
    static FeatureNode[] shape3 = {new FeatureNode(1, 9), new FeatureNode(2, 9)};
    static FeatureNode[] shape4 = {new FeatureNode(1, 10), new FeatureNode(2, 10)};

    // not squares
    static FeatureNode[] shape5 = {new FeatureNode(1, 5), new FeatureNode(2, 6)};
    static FeatureNode[] shape6 = {new FeatureNode(1, 3), new FeatureNode(2, 4)};
    static FeatureNode[] shape7 = {new FeatureNode(1, 6), new FeatureNode(2, 9)};
    static FeatureNode[] shape8 = {new FeatureNode(1, 4), new FeatureNode(2, 2)};

    // unknown squares
    static FeatureNode[] unkown1 = {new FeatureNode(1, 32), new FeatureNode(2, 32)};
    static FeatureNode[] unkown2 = {new FeatureNode(1, 4), new FeatureNode(2, 2)};
    static FeatureNode[] unkown3 = {new FeatureNode(1, 4), new FeatureNode(2, 2)};
    static FeatureNode[][] trainingSetWithUnknown = {
        shape1,
        shape2,
        shape3,
        shape4,
        shape5,
        shape6,
        shape7,
        shape8
    };
    public static void main(String[] args) throws IOException {

        Problem problem = new Problem();

        // number of training examples
        problem.l = NUM_OF_TS_EXAMPLES;

        // number of features
        problem.n = NUM_OF_TS_EXAMPLES + 1;

        // problem.x = ... // feature nodes
        problem.x = trainingSetWithUnknown;

        // problem.y = ... // target values
        problem.y = GROUPS_ARRAY;

        SolverType solver = SolverType.L2R_LR; // -s 0
        double C = 1.0; // cost of constraints violation
        double eps = 0.01; // stopping criteria

        Parameter parameter = new Parameter(solver, C, eps);
        Model model = Linear.train(problem, parameter);
        File modelFile = new File("model");
        model.save(modelFile);
        // load model or use it directly
        model = Model.load(modelFile);

        Feature[] instance = new FeatureNode[5];
        double prediction = Linear.predict(model, instance);
    }
}

运行它后,我在控制台中得到了这个结果:

iter  1 act 1.969e-02 pre 1.966e-02 delta 4.283e-03 f 5.545e+00 |g| 9.192e+00 CG   1

Exception in thread "main" java.lang.NullPointerException
at de.bwaldvogel.liblinear.Linear.predictValues(Linear.java:370)
at de.bwaldvogel.liblinear.Linear.predict(Linear.java:316)
at Main.main(Main.java:73)

我究竟做错了什么?

4

2 回答 2

1

我猜想的原因NullPointerException是您将未初始化的特征数组传递给预测函数 - 尝试先初始化instance

Feature[] instance = { new FeatureNode(1, 4), new FeatureNode(2, 2) };
于 2012-11-29T21:25:05.013 回答
0

除了那个 NullPointer 问题,这个例子只产生了奇怪的预测,主要是因为特征数量错误,这是我的版本:

public class LibLinearTest {

// 1 = quadratic, -1 = non-quadratic
static double[] GROUPS_ARRAY = {1, 1, 1, 1, -1, -1, -1, -1};

// quadratic
static FeatureNode[] tp1 = {new FeatureNode(1,  2), new FeatureNode(2,   4)};
static FeatureNode[] tp2 = {new FeatureNode(1,  4), new FeatureNode(2,   8)};
static FeatureNode[] tp3 = {new FeatureNode(1,  9), new FeatureNode(2,  81)};
static FeatureNode[] tp4 = {new FeatureNode(1, 10), new FeatureNode(2, 100)};

// not quadratic
static FeatureNode[] tp5 = {new FeatureNode(1, 5), new FeatureNode(2, 6)};
static FeatureNode[] tp6 = {new FeatureNode(1, 3), new FeatureNode(2, 4)};
static FeatureNode[] tp7 = {new FeatureNode(1, 6), new FeatureNode(2, 9)};
static FeatureNode[] tp8 = {new FeatureNode(1, 4), new FeatureNode(2, 2)};

// unknown 
static FeatureNode[] up1 = {new FeatureNode(1, 32), new FeatureNode(2, 32)};
static FeatureNode[] up2 = {new FeatureNode(1,  5), new FeatureNode(2, 25)};
static FeatureNode[] up3 = {new FeatureNode(1,  4), new FeatureNode(2,  2)};

static FeatureNode[][] trainingSetWithUnknown = {
    tp1, tp2,  tp3, tp4, tp5, tp6, tp7, tp8
};


public static void main(String[] args) throws IOException {

    Problem problem = new Problem();
    problem.l = trainingSetWithUnknown.length;
    problem.n = 2;
    problem.x = trainingSetWithUnknown;
    problem.y = GROUPS_ARRAY;

    SolverType solver = SolverType.L2R_LR; // -s 0
    double C = 1.0; // cost of constraints violation
    double eps = 0.001; // stopping criteria

    Parameter parameter = new Parameter(solver, C, eps);
    Model model = Linear.train(problem, parameter);

    Feature[] instance = tp1;
    double prediction = Linear.predict(model, instance);

    System.out.println("prediction : " + prediction);    
}
}
于 2014-11-25T12:15:44.437 回答