Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java libsvm分类-目前处于糟糕阶段_Java_Libsvm - Fatal编程技术网

Java libsvm分类-目前处于糟糕阶段

Java libsvm分类-目前处于糟糕阶段,java,libsvm,Java,Libsvm,问题:我有一些数据需要分类-有用(1)/无用(0)。我将提供全套数据作为分类器训练的输入。并使用不同的数据集进行测试 为此,我尝试将数据转换为LIBSVM格式。在做任何事情之前,我想提供一个向量的数字输入并检查结果 输入: 培训:1 2(第一个1表示此向量中的有用类,后面是数字输入) 测试:12(我不确定输入数据格式) 输出: (0:0.9982708183417436)(1:0.0017291816582564153)(实际值:1.0预测值:0.0) 我在培训集中没有0班,但它已经为0班做了评

问题:我有一些数据需要分类-有用(1)/无用(0)。我将提供全套数据作为分类器训练的输入。并使用不同的数据集进行测试

为此,我尝试将数据转换为LIBSVM格式。在做任何事情之前,我想提供一个向量的数字输入并检查结果

输入:

培训:1 2(第一个1表示此向量中的有用类,后面是数字输入) 测试:12(我不确定输入数据格式)

输出:

(0:0.9982708183417436)(1:0.0017291816582564153)(实际值:1.0预测值:0.0)

我在培训集中没有0班,但它已经为0班做了评估

我真的不知道如何将我的数据转换为数字向量输入,并从数字测试数据集中获取数据,以获得所提供的等效数据。我们非常感谢您在这方面提供的任何帮助

计划任务: 1.将所有数据加载到哈希表,并使用相应的分类器获取要保存在数据集中的键-有用(1)。 2.将数据集提供给svmTrain并获取模型。 3.准备测试数据集(如果找到,将每个单词/短语转换为相应的数值保存的训练集。否则,指定一个新值)。 4.为支持向量机的评估方法提供测试集和模型。 5.从有用的类中获取结果向量并重新映射到数据

代码:从不同来源使用。 公共类数据格式{

static double[][] train = new double[1000][3];

public static void main(String[] args) {
    // TODO Auto-generated method stub
    HashMap<String, Integer> dataSet = new HashMap<String, Integer>();

    double[][] test = new double[10][3];

    train[1][0] = 1;
    train[1][1] = 1;
    train[1][2] = 2;

    svm_model model =  svmTrain();
            //Test Data Set  
    double[] test1 = new double[3];
    test1[0] = 1;
    test1[1] = 1;
    test1[2] = 2;
    evaluate(test1,model);

    }

    private static svm_model svmTrain() {
        svm_problem prob = new svm_problem();
        int dataCount = train.length;
        prob.y = new double[dataCount];
        prob.l = dataCount;
        prob.x = new svm_node[dataCount][];     

        for (int i = 0; i <dataCount; i++){             
            double[] features = train[i];
            //ystem.out.println("Features "+features[i]);
            prob.x[i] = new svm_node[features.length-1];
            for (int j = 1; j < features.length; j++){
                svm_node node = new svm_node();
                node.index = j;
                node.value = features[j];
                prob.x[i][j-1] = node;
            }           
            prob.y[i] = features[0];

        }               

        svm_parameter param = new svm_parameter();
        param.probability = 1;
        param.gamma = 0.5;
        param.nu = 0.5;
        param.C = 1;
        param.svm_type = svm_parameter.C_SVC;
        param.kernel_type = svm_parameter.LINEAR;       
        param.cache_size = 20000;
        param.eps = 0.001;      

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

        return model;
    }

    public static double evaluate(double[] features, svm_model model) 
    {
        svm_node[] nodes = new svm_node[features.length-1];
        for (int i = 1; i < features.length; i++)
        {
            svm_node node = new svm_node();
            node.index = i;
            node.value = features[i];

            nodes[i-1] = node;
        }

        int totalClasses = 2;       
        int[] labels = new int[totalClasses];
        svm.svm_get_labels(model,labels);

        double[] prob_estimates = new double[totalClasses];
        double v = svm.svm_predict_probability(model, nodes, prob_estimates);

        for (int i = 0; i < totalClasses; i++){
            System.out.print("(" + labels[i] + ":" + prob_estimates[i] + ")");
        }
        System.out.println("(Actual:" + features[0] + " Prediction:" + v + ")");
        return v;
    }


}
static double[]train=new double[1000][3];
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
HashMap数据集=新的HashMap();
双精度[]测试=新双精度[10][3];
列车[1][0]=1;
列车[1][1]=1;
列车[1][2]=2;
svm_模型=svmTrain();
//测试数据集
double[]test1=新的double[3];
test1[0]=1;
test1[1]=1;
test1[2]=2;
评估(测试1,模型);
}
私有静态svm_模型svmTrain(){
svm_问题prob=新的svm_问题();
int dataCount=列车长度;
prob.y=新的双精度[数据计数];
prob.l=数据计数;
prob.x=新的svm_节点[dataCount][];

对于(int i=0;i我不能完全确定,但问题可能是因为您需要用
+1
标记正面示例,用
-1
标记负面示例

否则,libsvm软件可能会将仲裁类(例如
0
)关联到训练向量
12
,因为它会将特征向量的第一个元素设置为特征值(而不是标签类)

因此,尝试将类标签1更改为+1(正面示例为-1,负面示例为-1)

通常,libsvm的数据格式如下:

<label> <index1>:<value1> <index2>:<value2>
::
其中:

  • 标签是类别标签(例如+1/-1)
  • indexN是特征Id(即识别特定特征的编号)
  • valueN是特征值(即指定特征的值:二进制特征为0/1,分类特征为0,1,2,…)
libsvm工具可接受的数据格式示例见本页:


为了理解libsvm工具所接受的数据格式,您可以浏览许多数据集。

感谢您的回答,获得了一些清晰的信息。谢谢。