2016-04-13 4 views
0

Скажем, я пытаюсь оптимизировать параметры функции при данных данных. Скажем, что параметр представляет собой трехэлементный вектор. Используя функцию constrOptim, я мог бы установить условия, что сумма параметров должна быть больше или равна 1, ... (используя аргументы ui и ci функции constrOptim).R: Ограниченная оптимизация: установите ограничение на количество ненулевых параметров

Но как бы я хотел ограничить вектор параметров из трех элементов, чтобы иметь только 2 ненулевых элемента? Я не могу найти способ - я думал о том, чтобы указать 4-элементный вектор параметров, где 4-й элемент является функцией первых трех элементов вектора (т. Е. Подсчитывает число ненулевых в первых трех элементах вектора а затем ограничить это до определенного числа), но не может заставить ничего работать. Любые идеи (очень ценятся)?

#Some simple code as context: 
data=cbind(rnorm(5)+1,rnorm(5)+1,rnorm(5)+1) 
par=c(0.5,0.3,0.2) 
fn=function(par,data) {return(as.numeric(rep(1,times=5)%*%(data%*%par)))} 

#setting the conditions that the sum of the parameters must be 1: 
u1<-rbind(c(1,1,1),c(-1,-1,-1)) 
c1<-c(0.999, -1.001) 
constr.optim1<-constrOptim(c(0.3,0.3,0.4), f=fn, data=data,grad=NULL, ui=u1, ci=c1) 
sum(constr.optim1$par) #=0.99997 which is close enough to 1 as specified 

#But how would I set/restrict: 
length(which(constr.optim1$par!=0)) #to equal 2 and not 3? 

ответ

1

Я боюсь, что «k из n может быть отличным от нуля» является трудным ограничением. Иногда это называется ограничением мощности. В основном нам нужно добавить дополнительные бинарные переменные решения, чтобы указать, равна ли переменная нулевой или нет. Это сделает модель так называемой моделью MINLP (смешанное целочисленное нелинейное программирование). Чтобы решить эту проблему, вам понадобится решатель MINLP (который легко доступен, например, через NEOS).

0

В R есть пакеты для нелинейной оптимизации с ограничениями, где вы можете указать constrainst с точки зрения неравенства. Посмотрите в Optimisation view для пакетов, соответствующих нелинейному программированию.

Смежные вопросы