Vấn đề với libsvm e1071?


13

Tôi có một bộ dữ liệu với hai lớp chồng chéo, bảy điểm trong mỗi lớp, các điểm nằm trong không gian hai chiều. Trong R và tôi đang chạy svmtừ e1071gói để xây dựng một siêu phẳng tách biệt cho các lớp này. Tôi đang sử dụng lệnh sau:

svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)

nơi xchứa các điểm dữ liệu của tôi và ychứa nhãn của họ. Lệnh trả về một đối tượng svm, mà tôi sử dụng để tính toán các tham số (vectơ bình thường) và (chặn) của siêu phẳng tách biệt.wb

Hình (a) bên dưới hiển thị các điểm của tôi và siêu phẳng được trả về bởi svmlệnh (hãy gọi siêu phẳng này là điểm tối ưu). Điểm màu xanh có ký hiệu O hiển thị nguồn gốc không gian, các đường chấm chấm hiển thị lề, được khoanh tròn là các điểm có giá trị khác không (biến chùng).ξ

Hình (b) cho thấy một siêu phẳng khác, đó là bản dịch song song của cái tối ưu theo 5 (b_new = b_optimal - 5). Không khó để thấy rằng đối với siêu phẳng này, hàm mục tiêu (được tối thiểu hóa bởi phân loại C Svm) sẽ có giá trị thấp hơn so với siêu phẳng tối ưu được hiển thị trong hình ( a). Vì vậy, có vẻ như có một vấn đề với chức năng này ? Hay tôi đã phạm sai lầm ở đâu đó?

0,5||w||2+coStΣξTôi
svm

nhập mô tả hình ảnh ở đây

Dưới đây là mã R tôi đã sử dụng trong thí nghiệm này.

library(e1071)

get_obj_func_info <- function(w, b, c_par, x, y) {
    xi <- rep(0, nrow(x))

    for (i in 1:nrow(x)) {
        xi[i] <- 1 - as.numeric(as.character(y[i]))*(sum(w*x[i,]) + b)
        if (xi[i] < 0) xi[i] <- 0
    }

    return(list(obj_func_value = 0.5*sqrt(sum(w * w)) + c_par*sum(xi), 
                    sum_xi = sum(xi), xi = xi))
}

x <- structure(c(41.8226593092589, 56.1773406907411, 63.3546813814822, 
66.4912298720281, 72.1002963174962, 77.649309469458, 29.0963054665561, 
38.6260575252066, 44.2351239706747, 53.7648760293253, 31.5087701279719, 
24.3314294372308, 21.9189647758150, 68.9036945334439, 26.2543850639859, 
43.7456149360141, 52.4912298720281, 20.6453186185178, 45.313889181287, 
29.7830021158501, 33.0396571934088, 17.9008386892901, 42.5694092520593, 
27.4305907479407, 49.3546813814822, 40.6090664454681, 24.2940422573947, 
36.9603428065912), .Dim = c(14L, 2L))

y <- structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("-1", "1"), class = "factor")

a <- svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)

w <- t(a$coefs) %*% a$SV;
b <- -a$rho;

obj_func_str1 <- get_obj_func_info(w, b, 50000, x, y)
obj_func_str2 <- get_obj_func_info(w, b - 5, 50000, x, y)

Bạn đã điều chỉnh các tham số chi phí?
đua Etienne

Lưu ý rằng thẻ BUGS đề cập đến suy luận Bayes sử dụng Lấy mẫu Gibbs, không phải là vấn đề phần mềm. Tôi đã xóa thẻ.
Sycorax nói Phục hồi lại

Câu trả lời:


5

Trong libsvm FAQ được đề cập rằng các nhãn được sử dụng "bên trong" thuật toán có thể khác với thuật toán của bạn. Điều này đôi khi sẽ đảo ngược dấu hiệu của "coefs" của mô hình.

y= =[-1,+1,+1,-1,...]y+11

αnynwy

Xem câu hỏi "Tại sao dấu hiệu của các nhãn dự đoán và giá trị quyết định đôi khi bị đảo ngược?" ở đây .


4

Tôi đã gặp vấn đề tương tự khi sử dụng LIBSVM trong MATLAB. Để kiểm tra nó, tôi đã tạo ra một tập dữ liệu phân tách tuyến tính 2D rất đơn giản, tình cờ được dịch dọc theo một trục ra khoảng -100. Việc huấn luyện một Svm tuyến tính bằng cách sử dụng LIBSVM đã tạo ra một siêu phẳng có khả năng chặn vẫn ở khoảng 0 (và do đó, tỷ lệ lỗi là 50%, một cách tự nhiên). Chuẩn hóa dữ liệu (trừ giá trị trung bình) đã giúp, mặc dù kết quả là Svm vẫn không thực hiện hoàn hảo ... bối rối. Dường như LIBSVM chỉ xoay siêu phẳng về trục mà không dịch nó. Có lẽ bạn nên thử trừ giá trị trung bình khỏi dữ liệu của mình, nhưng có vẻ lạ khi LIBSVM sẽ hành xử theo cách này. Có lẽ chúng ta đang thiếu một cái gì đó.

Để biết giá trị của nó, hàm MATLAB tích hợp đã svmtraintạo ra một bộ phân loại với độ chính xác 100%, không có tiêu chuẩn hóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.