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 が何であるかをよく理解していませんでした。また、この関数が何を返す必要があるのか​​ もわかりませんでした (これはグラム行列ですか?)

ご協力いただきありがとうございます!!

- - 編集:

私は次のことをしました:

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 に答える