2009-12-24 37 views
35

Trong mỗi cuốn sách và ví dụ, chúng luôn chỉ phân loại nhị phân (hai lớp) và vectơ mới có thể thuộc về bất kỳ lớp nào.Cách phân loại nhiều lớp bằng cách sử dụng máy hỗ trợ Vector (SVM)

Ở đây vấn đề là tôi có 4 lớp (c1, c2, c3, c4). Tôi đã huấn luyện dữ liệu cho 4 lớp.

Đối với vector mới đầu ra nên giống như

C1 80% (người chiến thắng)

c2 10%

c3 6%

c4 4%

Cách thực hiện t của anh ấy? Tôi đang có kế hoạch sử dụng libsvm (vì nó phổ biến nhất). Tôi không biết nhiều về nó. Nếu bất kỳ người nào trong số các bạn sử dụng nó trước đây, hãy cho tôi biết các lệnh cụ thể mà tôi phải sử dụng.

Trả lời

3

Bạn luôn có thể giảm sự cố phân loại nhiều lớp thành vấn đề nhị phân bằng cách chọn phân vùng ngẫu nhiên của tập hợp các lớp, đệ quy. Điều này không nhất thiết phải kém hiệu quả hoặc hiệu quả hơn việc học cùng một lúc, vì các vấn đề về học tập phụ đòi hỏi ít ví dụ hơn vì vấn đề phân vùng nhỏ hơn. (Có thể yêu cầu nhiều nhất một thời gian đặt hàng liên tục, ví dụ: dài gấp hai lần). Nó cũng có thể dẫn đến việc học chính xác hơn.

Tôi không nhất thiết phải đề xuất điều này, nhưng đó là một câu trả lời cho câu hỏi của bạn và là một kỹ thuật chung có thể áp dụng cho bất kỳ thuật toán học nhị phân nào.

11

Phương pháp thường được sử dụng là Một so với Phần còn lại và Một so với Một. Trong trường hợp đầu tiên bạn nhận được các phân loại n và lớp kết quả có số điểm cao nhất Trong lớp thứ hai, lớp kết quả thu được bằng phần lớn phiếu bầu của tất cả các phân loại.

AFAIR, libsvm hỗ trợ cả hai chiến lược đa giác.

+3

Tôi nghĩ libsvm chỉ hỗ trợ một so với một. Nhưng nó hoạt động thực sự tốt, mặc dù. –

30

LibSVM sử dụng phương pháp one-against-one cho các vấn đề học tập đa lớp. Từ số FAQ:

Q: Phương pháp nào sử dụng libsvm cho SVM nhiều lớp? Tại sao bạn không sử dụng phương pháp "1 chống lại phần còn lại"?

Đó là một lần đối đầu. Chúng tôi đã chọn nó sau khi so sánh sau đây: C.-W. Hsu và C.-J. Lin. A comparison of methods for multi-class support vector machines, Giao dịch IEEE trên mạng nơron, 13 (2002), 415-425.

"1 so với phần còn lại" là phương pháp hay có hiệu suất có thể so sánh được với "1-chống-1". Chúng tôi làm thứ hai chỉ vì thời gian đào tạo của nó ngắn hơn.

0

Nó không có công tắc (lệnh) cụ thể cho dự đoán nhiều lớp. nó sẽ tự động xử lý dự đoán đa lớp nếu tập dữ liệu đào tạo của bạn chứa nhiều hơn hai lớp.

0

Không có gì đặc biệt so với dự đoán nhị phân.xem ví dụ sau về dự đoán 3 lớp dựa trên SVM.

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]) 
0
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) 
+5

bạn có thể thêm bất kỳ mô tả nào để giúp người dùng hiểu nó không? câu trả lời của bạn có giá trị ít hơn nếu nó là mã một mình:/ – goto

+0

all_dataset.mat có 15 lớp, tôi sử dụng svm đa phân loại dựa trên việc xây dựng các tiện ích so với một phân loại svm nhị phân. – lin0Xu

Các vấn đề liên quan