C-SVM, :
min_{beta_0, beta, zeta} 1/2 w^T w + C sum_{i = 1}^N zeta_i
subject to:
y_i (w^T x_i + b) >= 1 - zeta_i, for all i = 1, 2, ..., N
zeta_i >= 0, for all i = 1, 2, ..., N
N
- .
, quadprog
, quadprog
, , Platt SMO, SVM.
quadprog
, , , .
, quadprog
, , , (., , http://www.r-bloggers.com/more-on-quadratic-progamming-in-r/), , beta_0
zeta_i
. , , , .
, spam
, :
library(kernlab) # for the spam data
data(spam)
spam <- spam[sample(nrow(spam), round(0.2 * nrow(spam)), replace = FALSE), ]
X <- spam[, 1:(ncol(spam) - 1)]
Y_f <- spam[, ncol(spam)]
Y <- 2 * (as.numeric(Y_f) - 1.5) # {-1, 1}
N <- nrow(X)
n_d <- ncol(X)
C <- 1
, , quadprog
:
, :
# b = (beta_0, beta, zeta),
# where: beta_0 in R, beta in Re^n_d, zeta in Re^N
, :
d <- c(0, rep(0, n_d), rep(-C, N))
eps <- 1e-10
D <- diag(c(eps, rep(1, n_d), rep(eps, N)))
I_N <- diag(N)
A_1 <- cbind(matrix(0, ncol = n_d + 1, nrow = N), I_N)
A_2 <- as.matrix(cbind(as.matrix(Y), X * as.matrix(Y)[, rep(1, n_d)], I_N))
rownames(A_1) <- NULL; rownames(A_2) <- NULL
colnames(A_1) <- NULL; colnames(A_2) <- NULL
A <- t(rbind(A_1, A_2))
b_0 <- c(rep(0, N), rep(1, N))
, :
library(quadprog)
results <- solve.QP(D, d, A, b_0)
b_optim <- results$solution
beta_0 <- b_optim[1]
beta <- b_optim[1 + (1:n_d)]
zeta <- b_optim[(n_d + 1) + (1:N)]
, X_test
, :
Y_pred <- sign(apply(X_test, 1, function(x) beta_0 + sum(beta * as.vector(x))))