2012-09-11 53 views
4

似乎每次SVM庫,用於C++或者是是否有支持,可以使用Visual Studio C++中使用自定義內核的任何SVM庫?

  1. 如果不允許自定義內核或
  2. Linux的排斥,將是一個神聖的痛苦與Visual Studio使用。

是否有任何支持自定義內核並可在Visual Studio(特別是2010)中使用的SVM庫?

+0

你需要什麼內核?在libsvm中,實現它們中的大部分都很簡單,雖然很煩人,您必須更改庫中的代碼才能執行它。 –

+0

卡方和直方圖相交。超級簡單的內核可以實現,但將它們添加到libsvm似乎並不重要。 – zebra

回答

9

就像我說的,很容易修改爲LIBSVM您需要什麼,這裏的解釋:http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f418

由於我不熟悉這兩個內核,我只是複製從谷歌的公式。我希望我弄明白了:D

A.直方圖交點內核(太糟糕了,不會渲染Latex):SUM(min(x_i,y_i)) - >我們可以更改線性內核並將其轉換爲這一項,所以,基本上,在3.12版本(最新版本),在svm.cpp:

- >線233的返回點(X [I]中,x [j]); - 你只需要代碼從內核::點方法複製並相應地改變,所以是這樣的:

double sum = 0; 
while(x->index != -1 && y->index != -1) 
{ 
    if(x->index == y->index) 
    { 
     sum += min(x->value, y->value); 
     ++x; 
     ++y; 
    } 
    else 
    { 
     if(x->index > y->index) 
      ++x; 
     else 
      ++y; 
    }   
} 
return sum; 

(正常的測試文件,x應具有相同的長度爲y我認了。如果測試或模型文件包含值爲0的屬性(可以省略),則存在特殊情況的分支,但是如果libsvm使用線性內核產生預期結果,那麼它對此修改後的結果也將工作正常)

- >第322行return dot(x,y); - 與上面相同

B.卡方內核:SUM((2 x_i y_i)/(x_i + y_i)) - 好吧,我們來看看......我想我們可以再次嘗試修改線性內核(也許一些優化的RBF的可以在這種情況下被利用,但讓我們忽略現在):

- >線233變爲:

double sum = 0; 
while(x->index != -1 && y->index != -1) 
{ 
    if(x->index == y->index) 
    { 
     sum += 2 * x->value * y->value/(x->value + y->value); 
     ++x; 
     ++y; 
    } 
    else 
    { 
     if(x->index > y->index) 
      ++x; 
     else 
      ++y; 
    }   
} 
return sum; 

- >線322 - 同上

PS:上面的代碼是用記事本編寫的,未經測試。如果它不起作用,請不要殺了我,並且您必須花費兩週時間調試隱藏的C代碼。 [諷刺]對於我來說,從第一次嘗試工作。[/諷刺]然而,你可以很容易,一旦你瞭解了工作流程,通過把破發點,在這兩個地方進行調試。如果遇到問題,我很樂意提供更多幫助,所以如果您遇到困難,請告訴我。

+1

真棒,感謝您的參考和所有的努力。這是修改libsvm的好腳步。很好的答案。 – zebra

+0

不客氣:)(我不會介意,如果你還給予好評的答案:P) –

相關問題