3

这是我的第一个 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 的??)

4

1 回答 1

1

为了传递一个函数,你需要使用@符号。这显示在docs中,其中引用:

@kfun — 内核函数的函数句柄。核函数必须是以下形式

最重要的是,这将起作用。

a=svmtrain(x,y,'kernel_function',@mykernel);
于 2012-12-10T16:36:10.990 回答