首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LIBSVM的epsilon-SVR

使用LIBSVM的epsilon-SVR
EN

Stack Overflow用户
提问于 2018-04-06 06:17:41
回答 1查看 265关注 0票数 1

我正在尝试使用Java中的LIBSVM中的epsilon-SVR预测单变量时间序列(我的数据由两列组成,一个时间戳和一个数值)。

当我不使用功能时,只考虑数组索引作为功能(我知道这是不值得信任的),它总是返回相同的值。如果我使用滑动窗口,也就是说,预测时间t的值的特征是时间t-1,t-2,...,t- sliding _window,它总是返回NaN。

我按照上面的方法训练模型:

代码语言:javascript
复制
public svm_model train(double[] series, int svmType, int kernelType, int degree, double gamma, double coef0, double C, double eps, double p, int shrinking, int nFeatures)
{
    series = normalize(series)
    svm_parameter params = new svm_parameter();
    svm_problem problem = new svm_problem();
    svm_node node = null;
    //----------Set parameters----------
    params.svm_type  = svmType;
    params.kernel_type = kernelType;
    params.degree = degree;
    params.gamma = 1/nFeatures;
    params.coef0 = coef0;
    params.C = C;
    params.eps = eps;
    params.cache_size=100;
    params.p = p;
    params.shrinking= shrinking;
    //----------Define problem----------
    problem.l = series.length;
    problem.y = series;
    problem.x = new svm_node[series.length][];
    for(int i=0;i<series.length;i++)
    {
       problem.x[i] = new svm_node[1];
       node = new svm_node();
       node.index = 0;
       node.value = i;
       problem.x[i][0] = node;
     }
    //----------Generate model----------
    svm_model svm_model = svm.svm_train(problem,params);
    return svm_model;
}



public svm_model trainSlidingWindow(double[] series, int svmType, int kernelType, int degree, double gamma, double coef0, double C, double eps, double p, int shrinking, int nFeatures, int slidingWindow)
{
    series = normalize(series)
    svm_parameter params = new svm_parameter();
    svm_problem problem = new svm_problem();
    svm_node node = null;
    //----------Set parameters----------
    params.svm_type  = svmType;
    params.kernel_type = kernelType;
    params.degree = degree;
    params.gamma = 1/nFeatures;
    params.coef0 = coef0;
    params.C = c;
    params.eps = eps;
    params.cache_size=100;
    params.p=p;
    params.shrinking= shrinking;
    //----------Define problem----------
    problem.l = series.length;
    problem.y = series;
    problem.x = new svm_node[series.length][slidingWindow];
    for(int i=0;i<series.length;i++)
    {
       problem.x[i] = new svm_node[slidingWindow];
       for(int j=0; j<slidingWindow;j++)
       {
          node = new svm_node();
          node.index = slidingWindow-(j+1);
          if(i-(j+1) <0)
             node.value = Double.NaN;
          else
             node.value = series[i-(j+1)];
             problem.x[i][j] = node;
       }
    }
   //----------Generate model----------
   svm_model svm_model = svm.svm_train(problem,params);
   return svm_model;
}

预测结果如下:

代码语言:javascript
复制
public double[] predict(double[] series, svm_model model, int steps)
{
    series = normalize(series);
    double[] yPred = new double[steps];
    for(int i=0;i<steps;i++)
    {
        svm_node[] nodes = new svm_node[1];
        svm_node node = new svm_node();
        node.index = 0;
        node.value = series.length + i;
        nodes[0] = node;
        yPred[i] = svm.svm_predict(model,nodes);
    }
    return denormalize(yPred);
}

public double[] predictSlidingWindow(double[] series, svm_model model, int steps, int slidingWindow)
{
    series = normalize(series);
    double[] yPred = new double[steps];
    double[] aux = new double[slidingWindow+steps];
    System.arraycopy(series,series.length-slidingWindow,aux,0, slidingWindow);
    for(int i=0;i<steps;i++)
    {
        svm_node[] nodes = new svm_node[slidingWindow];
        for(int j=0;j<slidingWindow;j++)
        {
            svm_node node = new svm_node();
            node.index = slidingWindow-(j+1);
            node.value = aux[i+j];
            nodes[j] = node;
        }
        yPred[i] = svm.svm_predict(model,nodes);
        aux[slidingWindow+i] = yPred[i];
    }
    return denormalize(yPred);
}

我做错了什么?提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-04-10 01:48:11

显然,将数据归一化并将gamma参数的值更改为1解决了这个问题。

当数据域过大时,在建立支持向量回归模型时,对其进行归一化处理,可以提高预测的质量和执行时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49682388

复制
相关文章

相似问题

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