これは私の最初の 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 が何であるかをよく理解していませんでした。また、この関数が何を返す必要があるのか もわかりませんでした (これはグラム行列ですか?)
ご協力いただきありがとうございます!!
- - 編集:
私は次のことをしました:
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 になったのですか??)