#r #optimization #minimum
Вопрос:
У меня есть функция R^5 -> R, и меня интересует ее минимум. В R есть множество функций, таких как optim, optimize или fminbnd в пакете R pracma. Но они просто принимают один аргумент, и я не понимаю страницу справки.
mindisturbed <- function(a,d1,d2,d3,p){
sum((data^(- a) * (d1 d2*cos(log(data)*2*pi/p) d3 *
sin(log(data)*2*pi/p)) - log(j))^2)
}
«Данные» и переменная «j» находятся в моих глобальных настройках. Это векторы длиной k. Аргументами функции являются все числовые числа длиной 1. Функция представляет собой остаточную квадратную сумму.
Итак, кто-нибудь знает, как минимизировать эту функцию в зависимости от всех ее аргументов?
Ответ №1:
Предполагая, что данные и j являются векторами одинаковой длины, попробуйте выполнить следующее. Вам могут понадобиться или не понадобиться лучшие начальные значения.
1) Используйте оптим вот так
st <- c(a = 1, d1 = 1, d2 = 1, d3 = 1, p = 1)
f <- function(x) mindisturbed(x[1], x[2], x[3], x[4], x[5])
optim(st, f)
2) или nls с алгоритмом по умолчанию, где st-из (1)
fo <- log(j) ~ data^(- a) * (d1 d2*cos(log(data)*2*pi/p) d3 *
sin(log(data)*2*pi/p))
nls(fo, start = st)
3) или nls с плинейным алгоритмом. В этом случае RHS формулы представляет собой матрицу с именами столбцов d1, d2 и d3, так что первый столбец умножает d1, второй d2 и третий d3. В start задаются только нелинейные параметры, т. е. a и p.
fo2 <- log(j) ~ data^(-a) * cbind(d1 = 1,
d2 = cos(log(data)*2*pi/p),
d3 = sin(log(data)*2*pi/p))
nls(fo2, start = c(a = 0.1, p = 0.1), algorithm = "plinear")
Примечание
Вопрос не включал данные и j, но мы можем использовать их, чтобы попробовать.
set.seed(123)
n <- 100
data <- runif(n, 1, 2)
j <- 1:n
o <- order(data)
j <- j[o]
data <- data[o]
Комментарии:
1. Большое спасибо. Я не уверен, как задать начальные значения для этого числового алгоритма в функции optim. Поэтому я собираюсь опробовать некоторые ценности. Но я рад, что функция работает, знаете.
2. Как показано, для nls с plinear требуется только 2 начальных значения, а не 5. Если попытки не увенчаются успехом, используйте пакет nls2 для поиска начальных значений.
3. о, я вижу, эта посылка от тебя 😉