这是我的第一个Matlab程序。
我正在尝试将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',知道这个会很好 技巧,但我需要循环,因为我要将内部产品更改为更复杂的东西。
我也真的不明白那些U,V和我真的没有得到什么这个功能 应该返回(是Gram矩阵吗?)
感谢您的帮助!!
---编辑:
我做了以下事情:
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抱怨大小错误(怎么得到88?)
答案 0 :(得分:0)
要传递函数,您需要使用@
符号。这显示在the docs中,引用:
@kfun - 内核函数的函数句柄。内核函数必须是
形式
最重要的是,这将有效。
a=svmtrain(x,y,'kernel_function',@mykernel);