簡體   English   中英

在libsvm中使用我自己的內核

[英]Using my own kernel in libsvm

我目前正在開發自己的內核以用於分類,並希望將其包含在libsvm中,以取代libsvm提供的標准內核。

但是,我不是100%知道如何執行此操作,並且顯然也不想犯任何錯誤。 當心,我的C ++不是很好。 我在libsvm常見問題頁面上找到了以下內容:

問:我想使用自己的內核。 有什么例子嗎? 在svm.cpp中,有兩個用於內核評估的子例程:k_function()和kernel_function()。 我應該修改哪一個? 一個示例是LIBSVM工具中的“用於字符串數據的LIBSVM”。

我們具有兩個功能的原因如下。 對於RBF內核exp(-g | xi-xj | ^ 2),如果我們先計算xi-xj,然后計算范數平方,則將進行3n次運算。 因此,我們考慮exp(-g(| xi | ^ 2-2dot(xi,xj)+ | xj | ^ 2)),並通過在開始時計算所有| xi | ^ 2,將運算次數減少為2n。 這是為了訓練。 對於預測,我們無法執行此操作,因此需要使用3n操作的常規子例程。 擁有自己的內核的最簡單方法是通過替換任何內核,將相同的代碼放入這兩個子例程中。

因此,我試圖找到兩個子路由k_function()和kernel_function()。 我發現前者在svm.cpp中具有以下簽名:

double Kernel::k_function(const svm_node *x, const svm_node *y,
              const svm_parameter& param)

我是對的,x和y分別將我的特征矩陣的一個觀測值(= row)存儲在一個數組中,並且我需要返回內核值k(x,y)嗎?

另一方面,我根本找不到函數kernel_function()。 內核類中有一個具有該名稱和以下聲明的指針

double (Kernel::*kernel_function)(int i, int j) const; 

這是在內核構造函數中設置的。 在這種情況下,我和j是什么? 我想我也需要設置此指針嗎?

一旦我重寫了Kernel :: k_function和Kernel :: ** kernel_function,我將完成工作,而libsvm將使用我的內核來比較兩個觀察結果?

謝謝!

您不必進入LIBSVM的代碼即可使用自己的內核,可以使用預先計算的內核選項(即-t 4 training_set_file)。

因此,您可以根據需要從外部計算內核矩陣,將值存儲在文件中,然后將預先計算的內核加載到LIBSVM。 在LIBSVM tar球中的README文件中有一個說明以及如何執行此操作的示例(請參見“ 預先計算的內核”部分第236行 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM