首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调整vlfeat SVM

调整vlfeat SVM
EN

Stack Overflow用户
提问于 2015-10-16 15:54:25
回答 1查看 194关注 0票数 0

我以6个样本的1个dim数据为例,并试图对vlfeat的支持向量机进行训练:

代码语言:javascript
运行
复制
data:
    [188.00000000;
      168.00000000;
      191.00000000;
      150.00000000;
      154.00000000;
      124.00000000]

前3个样本为阳性,最后3个样本为阴性。

我得到重量(包括偏见):

代码语言:javascript
运行
复制
w: -0.6220197226 -0.0002974511

问题是所有样本都被预测为负值,但它们显然是线性可分的。

为了学习,我使用了VlSvmSolverSgd和lambda0.01类型的求解器。

如果重要的话,我使用的是C API。

最低工作实例:

代码语言:javascript
运行
复制
void vlfeat_svm_test()
{
    vl_size const numData = 6 ;
    vl_size const dimension = 1 ;
    //double x[dimension * numData] = {188.0,168.0,191.0,150.0, 154.0, 124.0};
    double x[dimension * numData] = {188.0/255,168.0/255,191.0/255,150.0/255, 154.0/255, 124.0/255};
    double y[numData] = {1, 1, 1, -1, -1, -1} ;

    double lambda = 0.01;

    VlSvm *svm = vl_svm_new(VlSvmSolverSgd, x, dimension, numData, y, lambda);
    vl_svm_train(svm);

    double const * w= vl_svm_get_model(svm);
    double bias= vl_svm_get_bias(svm);
    for(int k=0;k<numData;++k)
    {
        double res= 0.0;
        for(int i=0;i<dimension;++i)
        {
            res+= x[k*dimension+i]*w[i];
        }
        int pred= ((res+bias)>0)?1:-1;

        cout<< pred <<endl;
    }

    cout << "w: ";
    for(int i=0;i<dimension;++i)
        cout<< w[i] <<" ";
    cout<< bias <<endl;

    vl_svm_delete(svm);
}

更新:

此外,我试图通过除以255对输入数据进行缩放,但没有任何效果。

更新2:

极低的lambda= 0.000001似乎解决了这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-26 15:06:20

这是因为VLFeat中的支持向量机求解器不直接估计模型和偏差,而是使用向数据中添加常数分量(如http://www.vlfeat.org/api/svm-fundamentals.html中提到的)并返回相应的模型权重作为偏差的解决方法。

因此,偏置项是正则化器的一部分,具有较高偏倚的模型在能量方面受到“惩罚”。这种效果在您的情况下尤其强烈,因为您的数据是非常低维的:)因此,您需要选择正则化参数LAMBDA的一个小值来降低正则化器的重要性。

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

https://stackoverflow.com/questions/33174696

复制
相关文章

相似问题

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