Я пытаюсь выполнить оптимизацию для двойной формы SVM, где я хотел бы оптимизировать a.Соберите данные из этого источника .Следуйте этому, чтобы загрузить данные в
train_dat<-read.csv("banknote-authentication_csv.csv", header=T)
names(train_dat)<-c('variance','skewness','curtosis','entropy','label')
train_dat[train_dat$label==2,'label']<- -1
Отсюда мне нужно создать некоторые дополнительные параметры
dat<-train_dat
y <- as.matrix(dat[,ncol(dat)])
x <- as.matrix(dat[,1:ncol(dat)-1])
a<-as.matrix(sample(c(0), 872, T))
ub<-100/873
Ниже приведена моя целевая функция.SVM_dual <-функция (a, x, y) {return ('target' = ((1/2) * sum (a% *% t (a) * y% *% t (y) * x% *% t)(x))) - sum (a))} Оттуда у меня есть ограничение равенства, </p>
eval_g_eq <- function(a, x, y){
constr <- t(a) %*% y
return(list("constraints"=constr))
}
И нижняя и верхняя границы,
lb <- rep(0,length(a))
ub <- rep(ub,length(a))
Отсюда я указываю дополнительную опциюпараметры,
local_opts <- list(
"algorithm"="NLOPT_LD_LBFGS",
"xtol_rel" = 1.0e-7)
opts <- list( "algorithm"="NLOPT_LD_LBFGS",
"xtol_rel" = 1.0e-7,
"maxeval" = 1000,
"local_opts" = local_opts )
И реализовать оптимизацию следующим образом.
res <- nloptr(
x0=c(a),
eval_f = SVM_dual,
lb = lb,
ub = ub,
eval_g_eq = eval_g_eq,
opts = opts,
x=x,
y=y)
Проблема, с которой я сталкиваюсь - ошибка,
Ошибка в is.nloptr(в отставке): Градиент для целевой функции необходим алгоритму NLOPT_LD_LBFGS, но не был предоставлен.
Кроме того, даже если я попробую другую технику,
res <- auglag(
x0=a,
fn=SVM_dual,
gr=NULL,
lower=lb,
upper=ub,
heq=eval_g_eq,
localsolver="LBFGS")
неверное количество элементов в якобиане ограничений равенства (равно 0, но должно быть 1 x 872 = 872)
Любая справка будет сильно оценена!