внедрение из R ^ d в [0,1]^ d

#r #optimization #constraints

#r #оптимизация #ограничения

Вопрос:

Я пытаюсь оптимизировать функцию по некоторым весам, которые все должны быть положительными и в сумме равняться единице.

Таким образом, я преобразую (неограниченные) значения с помощью функции :

 # Transformation of parameters (FOR ONLY 3 PARAMETRES)
g <- function(v) {
  # Ensure they in [0,1]
  v <- 1/(1 exp(v))
  # Ensure they add up to 1
  v <- c( v[1], v[2] * (1-v[1]) )
  u <- c(v, 1-sum(v))
  u
}
  

Как я могу обобщить это на параметры $ d $ вместо только 3?

Ответ №1:

Существуют различные способы, но в целом мы можем выделить два основных шага: придание значениям неотрицательности (путем принятия абсолютного значения, возведения в квадрат и т.д.) И нормализация для суммирования до единицы. Одним из довольно естественных вариантов было бы

 g <- function(v) abs(v) / sum(abs(v))
g(1:5)
# [1] 0.06666667 0.13333333 0.20000000 0.26666667 0.33333333
sum(g(1:5))
# [1] 1
  

где я решил использовать abs as, чтобы сделать веса неотрицательными, в то время как x / sum(x) это способ свести результирующий вектор к единице.

Если вы хотите, чтобы входные данные имели на одно измерение меньше, вы можете добавить дополнительное значение внутри функции. Поскольку это часть оптимизации, я не думаю, что вы хотите, чтобы это значение было случайным. Таким образом, это может быть либо фиксированным, либо зависящим от v детерминированным образом. Итак, мы можем использовать, например,

 g <- function(v) {
  v <- c(v, mean(v))
  abs(v) / sum(abs(v))
}
g(1:4)
# [1] 0.08 0.16 0.24 0.32 0.20
sum(g(1:4))
# [1] 1
  

Но, скорее всего, в вашей проблеме важно, что это за дополнительное значение и даже в какой позиции выходного вектора оно находится, поэтому я предлагаю убедиться, что это имеет смысл.

Комментарии:

1. Спасибо, это помогает. Но поскольку ограничение «суммировать до одного» увеличивает проблему на одно измерение, я бы хотел, чтобы входное значение (то, по которому я оптимизирую) было на одно измерение меньше. Но я обязательно попробую ваше.

2. да, таким образом, не имеет смысла просто брать среднее значение. Что имело бы смысл, так это взять «Дополнение к единице», но поскольку мы делим на сумму, это больше невозможно.

3. @lrnv, без дополнительных предположений (т. Е. о длине v и диапазоне его элементов) нельзя избежать деления на сумму.