У меня есть целевая функция 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' не найден