Как передать параметры в функцию, которая является аргументом другой функции - PullRequest
0 голосов
/ 23 мая 2019

У меня есть целевая функция f (x, d), где x - вектор двух переменных (x1, x2), а d - заданная матрица точек Nx2.f (x) - это функция расстояния, вычисляющая некоторое расстояние для вычисления от x до всех точек в d.

Я пытаюсь создать функцию градиентного спуска для расчета минимального значения моей функции.Сначала я создал функцию градиента, которая зависит от внешнего параметра d, который задается (см. Ниже).

# Customers location from an external file (100 customers)
locations = read.csv(file = 'locations.csv')

# Gradient of my objective function is:
obj_fun.grad <- function(x,d) {
  dx <- 2*(x[1] - d$x)/((x[1] - d$x)^2 + 1) 
  dy <- 2*(x[2] - d$y)/((x[2] - d$y)^2 + 1)
  s <- c(sum(dx),sum(dy))

  return (s)
}

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

grad.descent = function(grad.function, x0, max.iter=200, step.size=0.05, stopping.deriv=0.01,...) 
{
  # Calculating the length of the initial vector 
  n = length(x0) 

  # Create a matrix where the coordinates of different steps will be stored 
  xmat = matrix(0, nrow=n, ncol=max.iter)
  # Initial guess is the starting point
  xmat[,1] = x0

  for (k in 2:max.iter) {

    # Calculate the gradient, that depends on locations of customers
    grad.cur = grad.function(xmat[,k-1], d=d)

    # Check whether gradient is below the given threshold
    if (sqrt(t(grad.cur)%*%grad.cur) < stopping.deriv) {
      k = k-1; 
      break
      }

    # Move in the opposite direction of the grad
    xmat[,k] = xmat[,k-1] - step.size*grad.cur
    }

  # Remove unused positions
  xmat = xmat[,1:k] 

  # Return: 1) optimum position, 2) list of all positions, 3) number of iterations
  return(list(x=xmat[,k], xmat=xmat[,1:k], k=k))
}

Теперь я хотел бы вызвать функцию grad.descent, передаваемую, если файл местоположений является дополнительнымпараметр для передачи в функцию градиента:

gd1 <- grad.descent(obj_fun, x0 = c(200,200), max.iter = 200, step.size=0.5, locations)

Однако я получаю следующую ошибку:

Ошибка в fgrad (xmat [, k- 1], d = d): объект 'd' не найден

1 Ответ

0 голосов
/ 24 мая 2019

R говорит вам, что объект d не найден, потому что вы никогда не говорили ему, что было d.

Самый простой способ исправить это - заменить первую строку внутри цикла for в функции grad.descent следующей строкой:

grad.cur = grad.function(xmat[,k-1], d = locations)

Таким образом, функция grad.function знает, что она должна принимать кадр данных locations в качестве второго входа d.

Обратите внимание, что это работает, потому что R использует лексическая область видимости . Вы можете найти больше информации здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...