минимизация набора функций r - PullRequest
1 голос
/ 13 июня 2019

Мне нужно найти эффективный способ найти минимум множества однородных функций.

Я использую функцию stats :: optimize

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

myfun <- function (x) {
  sqrt((x-3)^2 + (x-4)^2 + (x-5)^2)
}

optimize(myfun, c(0,10) 

здесь нет проблем.

Однако мне нужно заменить эти числа каждой строкой фрейма данных, например

df <- data.frame(matrix(c(2,7,8,4,9,10,5,4,2), nrow = 3, ncol =3))

, например:

v <-df[1, ]
myfun2 <- function (v) {
  function(x) sqrt((x-v[1])^2 + (x-v[2])^2 + (x-v[3])^2)
}

optimize(myfun2, c(0,10))

Error in optimize(myfun2, c(0, 10)) : 
  invalid function value in 'optimize'

optimize(myfun2(df[1, ]), c(0,10))
Error in optimize(myfun2(df[1, ]), c(0, 10)) : 
  invalid function value in 'optimize'

для одного случая, чтов конечном итоге получается цикл for для покрытия каждой строки фрейма данных

, однако параметр optimize возвращает ошибку, если я передаю myfun2.

Извините, если это простой вопрос, но я действительно не могу найтиправильный способ решить эту проблему и любая помощь будет очень признателен.

Я также пытался

m <- matrix(c(2,7,8,4,9,10,5,4,2), nrow = 3, ncol =3)
myfun2 <- function (v) {
  function(x) sqrt((x-m[1,1])^2 + (x-m[1,2])^2 + (x-m[1,3])^2)
}       
optimize(myfun2, c(0,10))

Error in optimize(myfun2, c(0, 10)) : 
  invalid function value in 'optimize'

1 Ответ

1 голос
/ 13 июня 2019

Функция, которая должна использоваться, является исходной myfun, с номерами, замененными на v[1], v[2] и v[3], вызываемыми в цикле apply.

myfun <- function (x, v) {
  sqrt((x - v[1])^2 + (x - v[2])^2 + (x - v[3])^2)
}

df <- data.frame(matrix(c(2,7,8,4,9,10,5,4,2), nrow = 3, ncol =3))

res <- apply(df, 1, function(.v) optimize(myfun, c(0,10), v = .v))

do.call(rbind, res)
#     minimum  objective
#[1,] 3.666648 2.160247 
#[2,] 6.666666 3.559026 
#[3,] 6.666667 5.887841
...