使用没有梯度输入的LBFGS

时间:2019-04-09 05:04:28

标签: r nlopt

我正在尝试对SVM的双重形式进行优化,在此我想对其进行优化。收集来自此source的数据。按照此步骤将数据加载到

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 <-function(a,x,y){         返回(             'objective'=((1/2)* sum(a%*%t(a)* y%*%t(y)* x%*%t(x)))-sum(a)         )     } 从那里我有了一个平等约束,

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(ret)中的错误:目标函数的梯度为   算法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)

任何帮助将不胜枚举!

0 个答案:

没有答案