Например, если я хочу найти градиент и гессиан по отношению к x:
f = function(x,y,alpha,A,b){
return((1/n)*(y-alpha*x)%*%(y-alpha*x) + (A%*%x-b)%*%(A%*%x-b))
}
возможно пакет madness
?
Я думаю, что %*% все равно, транспонируете вы или нет, он всегда будет делать внутренний продукт. Спасибо, я посмотрю пакет безумия.
Я считаю, что @Onyambu прав, я не могу правильно вызвать вашу функцию. Мой ответ ниже что-то вычисляет, даже если это бессмысленно.
числовое или символьное? Если вам нужны числовые значения, используйте пакет numDeriv.
Он будет выполнять внутренний продукт только в том случае, если они являются векторами. но в вашем случае у вас есть заглавная буква А. Я так и думал, что это матрица.
О, да, вы правы, один из них нужно транспонировать
Пакет CRAN Deriv может вычислять символьные производные функций R.
В приведенном ниже коде я удалил вызов return
в опубликованной функции f
.
Функция DDeriv
является копией и вставкой из этого поста RPubs изменена на использование Deriv
вместо базы D
, которая не принимает функции в качестве первого аргумента.
library(Deriv)
DDeriv <- function(expr, name, order = 1){
if (order < 1) stop("Order must be >= 1")
if (order == 1) Deriv(expr, name)
else DDeriv(Deriv(expr, name), name, order - 1)
}
f <- function(x,y,alpha,A,b){
(1/n)*(y-alpha*x)%*%(y-alpha*x) + (A%*%x-b)%*%(A%*%x-b)
}
Используя функцию Deriv
напрямую:
Deriv(f, "x")
#function (x, y, alpha, A, b)
#{
# .e1 <- -alpha
# .e3 <- A %*% x - b
# .e5 <- y - alpha * x
# (.e1 %*% .e5 + .e5 %*% .e1)/n + .e3 %*% A + A %*% .e3
#}
Использование функции DDeriv
:
DDeriv(f, "x", 1)
#function (x, y, alpha, A, b)
#{
# .e1 <- -alpha
# .e3 <- A %*% x - b
# .e5 <- y - alpha * x
# (.e1 %*% .e5 + .e5 %*% .e1)/n + .e3 %*% A + A %*% .e3
#}
DDeriv(f, "x", 2)
#function (x, y, alpha, A, b)
#{
# .e1 <- -alpha
# 2 * (.e1 %*% .e1/n) + 2 * A %*% A
#}
является матрицей? если это так, вы не должны транспонировать где-то в своем уравнении?