0

libsvmtrain_ovaこのリンク の結果をプロットしたい: 10 倍のクロス検証での一対一の SVM (LibSVM を使用)

、このコードを使用しましlibsvmtrain_ovaたが、正しく機能していないと思います。

hold off
figure();
for j=1:numLabels
   w = models{j}.SVs' * models {j}.sv_coef;
   b = -models{j}.rho;
   c1 = find(double(labels==1) == 1);
   c2= find(double(labels==2) == 1);
   c3=find(double(labels==3) == 1);
   plot(X(c1,1), X(c1,2), 'ko', 'MarkerFaceColor', 'b'); hold on;
   plot(X(c2,1), X(c2,2), 'ko', 'MarkerFaceColor', 'g');hold on;
   plot(X(c3,1), X(c3,2), 'ko', 'MarkerFaceColor', 'r')
   % Plot the decision boundary
   plot_x = linspace(min(X(:,1)), max(X(:,1)), 30);
   plot_y = (-1/w(2))*(w(1)*plot_x + b);
   plot(plot_x, plot_y, 'k-', 'LineWidth', 2)
end
title(sprintf('SVM Linear Classifier with C = %g', 1), 'FontSize', 12)
4

1 に答える 1

0

あなたのコードはほとんど機能していません。あなたが見逃していると思われる多くの概念的な問題があるようです。次のことを理解していると仮定します。

  • 虹彩データ (リンクされた質問を参照) は 4 次元です。この空間の線形分類器は 4 次元の超平面であり、4 次元関数を 2 次元平面にプロットすることはできません。
  • 3 つのクラスに対して 1 対すべての分類器をプロットした結果は、3 つの超平面です。
  • プロット可能な結果は 1 つもないため、10 倍クロス検証の結果をプロットすること自体は意味がありません。すべての中間結果をプロットできますが、それを達成できるのは遠く離れています。

それでも、ここには本当の問題があると思います。虹彩データの 2 次元を取得し、分離超平面 (この場合は線) をプロットします。リンクされたコードを取得したら、次のことを行う必要があります。

  • 2 つの次元を選択します。私の場合は、虹彩データの次元 3 と 4 を選択しました。
  • データを 2 つに分割します。1 つはトレーニング用、もう 1 つはテスト用です。
  • 少し計算して、点と線をプロットします。

これはコードです:

S = load('fisheriris');
data = zscore(S.meas);
data = data(:,3:4);
labels = grp2idx(S.species);

opts = '-s 0 -t 2 -c 1 -g 0.25';    %# libsvm training options

indices = crossvalidation(labels, 2); 
testIdx = (indices == 1); trainIdx = ~testIdx;
mdl = libsvmtrain_ova(labels(trainIdx), data(trainIdx,:), opts);
figure(1);
numlabels = numel(unique(labels));
testlabels = labels(testIdx);
testdata = data(testIdx,:);
style = {'b+','r+','g+'};
stylel = {'b-','r-','g-'};
for i=1:numlabels,
    plot(testdata(find(testlabels==i),1),testdata(find(testlabels==i),2),style{i});
    hold on;
    w = mdl.models{i}.SVs' * mdl.models{i}.sv_coef;
    b = -mdl.models{i}.rho;
    x = -2:0.1:2
    y = -(w(1)/w(2))*x - (b/w(2));
    plot(x,y,stylel{i});
end

grid on;
hold off;

これはプロットです:

ここに画像の説明を入力

色付きの各線は、その色のポイントを他のすべての色から分割する必要があります。線はトレーニングによって得られたものであり、ポイントはトレーニングしていないデータのテストから得られたものであることに注意してください。

于 2012-12-31T09:40:49.927 に答える