2015-10-16 57 views
0

我有1個昏暗的數據,例如6個樣品,我想訓練就可以了vlfeat的SVM:調整vlfeat SVM

data: 
    [188.00000000; 
     168.00000000; 
     191.00000000; 
     150.00000000; 
     154.00000000; 
     124.00000000] 

第3個樣品是積極的,最後3個樣本均爲負面。

,我得到的權重(包括偏置):

w: -0.6220197226 -0.0002974511 

的問題是,所有的樣品得到預測爲負,但他們顯然是線性可分。

爲了學習,我使用求解器類型VlSvmSolverSgd和lambda 0.01。

我正在使用C API,如果它很重要。

最低工作例如:

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:

極低的拉姆達= 0.000001似乎解決問題。

回答

1

發生這種情況的原因是VLFeat中的SVM求解器不直接估計模型和偏差,而是使用向數據中添加常數分量的方法(如http://www.vlfeat.org/api/svm-fundamentals.html中所述)並返回相應的模型權重作爲偏差。

因此,偏倚項是正規化的一部分,具有較高偏倚的模型在能量方面「受到懲罰」。由於您的數據維度非常低,因此這種效果尤其強大:) 因此,您需要選擇正則化參數LAMBDA的較小值來降低正規化器的重要性。