我正在尝试对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)
任何帮助将不胜枚举!