首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LibSvm使用JAVA添加特性

LibSvm使用JAVA添加特性
EN

Stack Overflow用户
提问于 2014-03-18 13:33:07
回答 1查看 190关注 0票数 0

我有一个文本,我想通过使用java添加特性来进行培训。查看示例,构建培训集的主要类是svm_problem。看起来,svm_node表示一个特性(索引是该特性,是该功能的权重)。

我所做的就是有一个地图(只是为了简化问题),以保持功能和索引之间的关联。对于我的每个weight>示例,我确实创建了一个新节点:

代码语言:javascript
复制
  svm_node currentNode = new svm_node();
  int index = feature.getIndexInMap();
  double value = feature.getWeight();
  currentNode.index = index;
  currentNode.value = value;

我的直觉正确吗?svm_problem.y指的是什么?它是指标签的索引吗?svm_problem.l仅仅是两个向量的长度吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-20 13:25:55

您的直觉非常接近,但是svm_node是一个模式,而不是一个特性。变量svm_problem.y是一个数组,它包含每个模式的标签,而svm_problem.l是训练集的大小。

另外,请注意,svm_parameter.nr_weight是每个标签的权重(如果您有一个不平衡的培训集,则很有用),但是如果您不打算使用它,则必须将该值设置为零。

让我在C++中向您展示一个简单的示例:

代码语言:javascript
复制
#include "svm.h"
#include <iostream>

using namespace std;

int main()
{
    svm_parameter params;


    params.svm_type = C_SVC;
    params.kernel_type = RBF;
    params.C = 1;
    params.gamma = 1;
    params.nr_weight = 0;
    params.p= 0.0001;

    svm_problem problem;
    problem.l = 4;
    problem.y = new double[4]{1,-1,-1,1};
    problem.x = new svm_node*[4];

    {
    problem.x[0] = new svm_node[3];
    problem.x[0][0].index = 1;
    problem.x[0][0].value = 0;
    problem.x[0][1].index = 2;
    problem.x[0][1].value = 0;
    problem.x[0][2].index = -1;

    }

    {
    problem.x[1] = new svm_node[3];
    problem.x[1][0].index = 1;
    problem.x[1][0].value = 1;
    problem.x[1][1].index = 2;
    problem.x[1][1].value = 0;
    problem.x[1][2].index = -1;
    }

    {
    problem.x[2] = new svm_node[3];
    problem.x[2][0].index = 1;
    problem.x[2][0].value = 0;
    problem.x[2][1].index = 2;
    problem.x[2][1].value = 1;
    problem.x[2][2].index = -1;
    }

   {
    problem.x[3] = new svm_node[3];
    problem.x[3][0].index = 1;
    problem.x[3][0].value = 1;
    problem.x[3][1].index = 2;
    problem.x[3][1].value = 1;
    problem.x[3][2].index = -1;

    }

    for(int i=0; i<4; i++)
    {
        cout << problem.y[i] << endl;
    }

    svm_model * model = svm_train(&problem, &params);
    svm_save_model("mymodel.svm", model);

    for(int i=0; i<4; i++)
    {
        double d = svm_predict(model, problem.x[i]);

        cout << "Prediction " << d << endl;
    }
    /* We should free the memory at this point. 
       But this example is large enough already */ 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22480993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档