Использование LBFGS без градиентного ввода - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь выполнить оптимизацию для двойной формы 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)

Любая справка будет сильно оценена!

...