【发布时间】:2012-11-28 02:17:36
【问题描述】:
这是我的第一个 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 的??)
【问题讨论】:
-
顺便说一句,当我做 svmtrain(x,y,'kernel_function','linear');或任何其他预定义内核,一切正常
-
检查你的 for 循环。好像你想要
i=1:size(....) -
正确。这只是一个错字。请看我上次的编辑
-
你的 y 尺寸是多少?这不是组的向量吗?
-
你知道那些 u,v 是什么吗?它们具有相同的 x 维度!