すべての本と例では、常にバイナリ分類(2つのクラス)のみを示しており、新しいベクトルは任意の1つのクラスに属することができます。
ここでの問題は、4つのクラス(c1、c2、c3、c4)があることです。 4つのクラスのトレーニングデータがあります。
新しいベクトルの場合、出力は次のようになります
C1 80%(勝者)
c2 10%
c3 6%
c4 4%
これを行う方法? libsvmを使用する予定です(最も人気があるため)。私はそれについてあまり知りません。皆さんが以前に使用したことがある場合は、使用することになっている特定のコマンドを教えてください。
LibSVMは、マルチクラス学習問題にone-against-oneアプローチを使用します。 [〜#〜] faq [〜#〜] から:
Q:libsvmはマルチクラスSVMにどのメソッドを使用しますか? 「1-against-the rest」メソッドを使用しないのはなぜですか?
1対1です。次の比較を行った後で選択しました。C.-W。スーとC.-Jリン。 マルチクラスサポートベクターマシンのメソッドの比較 、IEEEトランザクションオンニューラルネットワーク、13(2002)、415-425。
「1-against-the rest」は、パフォーマンスが「1-against-1」に匹敵する優れた方法です。後者は、トレーニング時間が短いためです。
一般的に使用される方法は、One vs. RestおよびOne vs. Oneです。最初の方法では、n個の分類子を取得し、結果のクラスのスコアが最高になります。 2番目の方法では、結果のクラスは、すべての分類子の多数決によって取得されます。
AFAIR、libsvmは、マルチクラス分類の両方の戦略をサポートしています。
クラスのセットのランダムなパーティションを再帰的に選択することにより、いつでもマルチクラス分類問題をバイナリ問題に減らすことができます。サブ学習の問題は分割の問題が小さいため、必要な例が少ないため、これは必ずしも一度に学習するよりも効果的または効率的ではありません。 (最大で一定の注文時間、たとえば2倍の時間がかかる場合があります)。また、より正確な学習につながる可能性があります。
必ずしもこれを推奨するわけではありませんが、これはあなたの質問に対する答えの1つであり、任意のバイナリ学習アルゴリズムに適用できる一般的な手法です。
SVM Multiclassライブラリを使用します。 Thorsten JoachimsによるSVMページ で見つけてください。
マルチクラス予測のための特定のスイッチ(コマンド)はありません。トレーニングデータセットに3つ以上のクラスが含まれる場合、マルチクラス予測を自動的に処理します。
バイナリ予測と比較して特別なことはありません。 SVMに基づく3クラス予測については、次の例を参照してください。
install.packages("e1071")
library("e1071")
data(iris)
attach(iris)
## classification mode
# default with factor response:
model <- svm(Species ~ ., data = iris)
# alternatively the traditional interface:
x <- subset(iris, select = -Species)
y <- Species
model <- svm(x, y)
print(model)
summary(model)
# test with train data
pred <- predict(model, x)
# (same as:)
pred <- fitted(model)
# Check accuracy:
table(pred, y)
# compute decision values and probabilities:
pred <- predict(model, x, decision.values = TRUE)
attr(pred, "decision.values")[1:4,]
# visualize (classes by color, SV by crosses):
plot(cmdscale(dist(iris[,-5])),
col = as.integer(iris[,5]),
pch = c("o","+")[1:150 %in% model$index + 1])
data=load('E:\dataset\scene_categories\all_dataset.mat');
meas = data.all_dataset;
species = data.dataset_label;
[g gn] = grp2idx(species); %# nominal class to numeric
%# split training/testing sets
[trainIdx testIdx] = crossvalind('HoldOut', species, 1/10);
%# 1-vs-1 pairwise models
num_labels = length(gn);
clear gn;
num_classifiers = num_labels*(num_labels-1)/2;
pairwise = zeros(num_classifiers ,2);
row_end = 0;
for i=1:num_labels - 1
row_start = row_end + 1;
row_end = row_start + num_labels - i -1;
pairwise(row_start : row_end, 1) = i;
count = 0;
for j = i+1 : num_labels
pairwise( row_start + count , 2) = j;
count = count + 1;
end
end
clear row_start row_end count i j num_labels num_classifiers;
svmModel = cell(size(pairwise,1),1); %# store binary-classifers
predTest = zeros(sum(testIdx),numel(svmModel)); %# store binary predictions
%# classify using one-against-one approach, SVM with 3rd degree poly kernel
for k=1:numel(svmModel)
%# get only training instances belonging to this pair
idx = trainIdx & any( bsxfun(@eq, g, pairwise(k,:)) , 2 );
%# train
svmModel{k} = svmtrain(meas(idx,:), g(idx), ...
'Autoscale',true, 'Showplot',false, 'Method','QP', ...
'BoxConstraint',2e-1, 'Kernel_Function','rbf', 'RBF_Sigma',1);
%# test
predTest(:,k) = svmclassify(svmModel{k}, meas(testIdx,:));
end
pred = mode(predTest,2); %# voting: clasify as the class receiving most votes
%# performance
cmat = confusionmat(g(testIdx),pred);
acc = 100*sum(diag(cmat))./sum(cmat(:));
fprintf('SVM (1-against-1):\naccuracy = %.2f%%\n', acc);
fprintf('Confusion Matrix:\n'), disp(cmat)