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 svm
từ e1071
gó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 x
chứa các điểm dữ liệu của tôi và y
chứ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.
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 svm
lệ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 đó?
svm
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)