ドキュメントを読むと、次のことがわかります。
3 番目の [戻り値] は、決定値または確率推定値を含む行列です ('-b 1' が指定されている場合)。k がトレーニング データ内のクラスの数である場合、決定値の場合、各行には k(k-1)/2 バイナリ クラス SVM の予測結果が含まれます。
したがって、2 クラスの問題の場合、得られるのは決定値を含むベクトルですf(z)
。したがって、これは、最初のクラスに属するすべての要素が d<0 であり、2 番目のクラスに属するすべての要素が d>0 であることを意味します。
一般に、libsvm は最初のクラスを最初に取得するラベルと見なします。したがって、信頼できる結果を得るには、最初にデータを並べ替える必要があります。
バイナリの場合もこれが当てはまります。svmtrain に与えるラベルが何であれ、最初に遭遇したものをクラス 1 として、2 番目のものをクラス -1 として受け取ります。これは、簡単なデータセットを与えることで簡単に検証できます。
Y = [-ones(100,1);ones(100,1)];
m = svmtrain(Y,Y); % train with all labels as data (never do this in practices, not the "all" part, not the training on labels part ;)
[a,b,c] = svmpredict(Y,Y,m); % of course this will give 100% accuracy.
b' % you can see that the first label will always have an internal representation of 1.
マルチクラス分類の場合、これは異なります。これには、各ピクセルのすべてのクラス シナリオに対して 1 対 1 のすべてのシナリオに対応する k(k-1)/2 エントリが含まれます。これは、たとえば次のことを意味します。サンプルごとに 4*3/2 = 6 つの値を持つ 4 クラスの問題:
[ f12(z) f13(z) f14(z) f23(z) f24(z) f34(z)]
さて、これらの関数の値が 1 対 1 でどのようにクラスにマップされるのか、コードを見て簡単に推測することはできませんでした。