#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
и диапазоне его элементов) нельзя избежать деления на сумму.