2012-12-10 66 views
2

這是我第一個Matlab程序。使用MATLAB svmtrain

我正在嘗試使用svmtrain和svmclassify與自定義內核。

假設我的內核是正規內積。

我應該怎麼寫?

我所做的:

function [K] = mykernel(U, V) 
    for i=size(U,1) 
     for j=size(V,1) 
      K(i,j) = dot(U(i,:),V(j,:)); 
     end 
    end 
    return 
end 

,然後在命令窗口:

x=randn(1000,10); 
w=rand(1,10); 
y=sign(x*w'); 
a=svmtrain(x,y,'kernel_function',mykernel); 

,我也得到:

Error using mykernel (line 2) 
Not enough input arguments. 

也許一個有一招,做沒有循環,像U * V',這將是很高興知道這個技巧,但我需要做循環,因爲我要改變t他內心的產品要更復雜一些。

我還沒有真正理解什麼是那些U,V,我並沒有真正得到這個功能 應該返回什麼(是革蘭氏矩陣?)

感謝您的幫助!

---編輯:

我做了以下內容:

function [K] = mink(U, V) 
    for i=1:size(U,1) 
     for j=1:size(V,1) 
      K(i,j) = min(exp(-dot(U(i,:),U(j,:))),exp(-dot(V(i,:),V(j,:)))); 
     end 
    end 
    return 
end 

>>x=randn(100,10); 
>>w=rand(1,10); 
>>y=sign(x*w'); 
>>a=svmtrain(x,y,'kernel_function',@mink); 
>>svmclassify(a, x) 
Error using svmclassify (line 114) 
An error was encountered during classification. 
Attempted to access U(89,:); index out of bounds because size(U)=[88,10]. 

所以現在svmtrain去工作,但svmclassify抱怨大小mismath(它是如何得到88?)

+0

btw當我做svmtrain(x,y,'kernel_function','linear');或任何其他預定義的內核,一切都很好 –

+0

檢查你的循環。好像你想'i = 1:size(....)' – Squazic

+0

沒錯。這只是一個錯字。請看我最後的編輯 –

回答

0

爲了要傳遞一個函數,你需要使用@這個符號。這顯示在the docs,其中引用:

@kfun - 內核函數的函數句柄。內核函數的格式必須爲

底線,這將起作用。

a=svmtrain(x,y,'kernel_function',@mykernel); 
+1

你是對的,我試過,看到被調用的函數,但我仍然無法得到它的工作。你能向我解釋一下我應該如何處理U,V?奇怪的是他們有和x一樣的尺寸。 –

+0

最有可能你只是想'K = U. * V;'。但我不確定你真的想要什麼功能,所以... – PearsonArtPhoto

+0

是的,但你是什麼?他們只是x?那麼爲什麼兩個參數?當我做disp(u),disp(v)時,我發現他們不同於一個呼叫到另一個呼叫。這裏發生了什麼? 說我想我的克矩陣的i,j元素是min(exp( - || A ||),exp( - || B ||)),其中A是x的第i行,並且B是x的第j行。我應該寫我的功能嗎?(忽略它看起來不是一個好內核的事實,只是爲了學習如何使用該matlab)。謝謝!!! –