Calcular gradiente y matriz hessiana en R

| Última modificación: 7 de noviembre de 2024 | Tiempo de Lectura: 3 minutos
Premios Blog KeepCoding 2025

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

La matriz hessiana es la generalización del concepto derivada segunda aplicada a funciones de vectores. En este artículo, te enseñaremos cómo puedes calcularla desde el lenguaje R y crear nuestra propia calculadora de matriz hessiana y la calculadora de gradientes.

Calcular matriz hessiana

Cuando hablamos de derivada primera en cálculo lineal y álgebra, hacemos alusión al gradiente. Cuando hablamos de derivada segunda, es lo que se conoce como matriz hessiana. Por eso, haremos nuestra calculadora de matriz hessiana.

Veamos:

matriz hessiana

Esto se convierte en una matriz de la siguiente forma:

matriz hessiana ejemplo 1

La matriz Hessiana es el Jacobiano del gradiente.

Por ejemplo, sabemos que:

matriz hessiana ejemplo 2

Su matriz hessiana se calcula así:

 matriz hessiana ejemplo 3

El resultado de la matriz hessiana es:

matriz hessiana ejemplo 4

Aplicando esta fórmula, que no es más que el gradiente dividido, obtenemos otro método para calcular el mínimo de una función.

Ejemplo en R

En R podemos usar el paquete pracma, que tiene las funciones grad() y hessian() para calcular el gradiente y la matriz hessiana. Por ejemplo, vamos a calcular en R el gradiente y la matriz hessiana de f(x1.x2), en el punto [2,1], que sabemos que es:

matriz hessiana ejemplo 5
In [92]: library (pracma)
f_x1x2<-function (x) {x[1]^2+x[2]^3}
xvec <-c (2,1)
print ("El gradiente es:")
grad (f_x1x2, xvec)
print ("La matriz Hessiana es:")
hessian (f_x1x2, xvec)

[1] «El gradiente es:»
4.00000000002088
3.00000000007066


[1] «La matriz Hessiana es:»

matriz hessiana ejemplo 6
In [ ]: library (pracma)
library (plotrix)
#my func30 <- function (x1,x2) (0.2*x1^4+x2^2}
myfunc3D <- function (x1,x2) (x1^2+3*x2^2}

myfuncVector <- function (x) { myfunc3D (x[1],x[2]) }

mygradient <- function (x, h, func){
      c((func (c (x [1] +h, x[2])) - func (x))/h,
          (func(c(x[1],x[2]+h))-func(x))/h) }

x_0 <- (-9, -9)
delta <- 0.025
delta <- 1

h < 0.001
criterio convergencia <- 0.05

x_historico <- data.frame (x=x_0 [1],y = x_0 [2])
for (i in 1:100) {
   #g <- mygradient (x_0, h, my funcVector)
     g <- inv (hessian (myfuncVector, x_0)) %*% as.matrix (grad      
       (myfuncVector, x_0), cols=1)
     x_new <- x_0 - g*delta
     if (abs(sum(g))<criterio_convergencia){
         break;
     }
     x_0 <- x new
     x_historico <- rbind (x_historico, data.frame (x = x_0 [1], y = x_0 [2])]
}
nrow (x_historico)

x1 <- seq (-10, 10, length-100)
x2 <- seq (-10, 10, length-100)
z <- oute r(x1,x2, my func3D)
image (x1,x2.z.col = terrain.colors (39))
contour (x1,x2,z, add = T)
points (x_historico$x, x_historico$y, col="black")
color scale.lines (x_historico$x,x historico$y, c(1,1,0)0, c(0,1,1), colvar=1:nrou(x_historico), lwd=3)

Problemas del método de Newton

A contninuación listamos algunos problemas para calcular la matriz hessiana.

  • Calcular la matriz hessiana es costoso, computacionalmente hablando.
  • Cuando la función es convexa y cuadrática, converge en un solo salto; si no es cuadrática, hacen falta más iteraciones.
  • Es útil solo cuando el punto crítico cercano es un mínimo.
In [ ]: library(pracma)
library(plotrix)
myfunc30<-function (x1,x2) {sin(x1)*sin(x2)/(x1*x2)}
x <- seq(-10,10, length=100)
y <- seq(-10,10,length=100)
z <- outer(x,y,myfunc3D)
image (x,y,z,col = terrain.colors(39))
contour(x,y,z,add=T)

myfuncVector<- function(x) { myfunc30(x[1],[2]) }

x_0<- c(-2,-7)
#x 0 <- c(-5, 1)
#x 6 <- c(-5,-4)
x0<- c(0.7,2)
delta <- 0,1
criterio convergencia<-1e-1

x_historico<- data.frame(x=x_0[1],y=x_0[2])
for (i in 1:1000) {
       g <- grad(myfuncVector,x_0)
       g <- inv(hessian (myfuncVector,x_0)) %*% as.matrix(grad   
       (myfuncVector,x_0), cols=1)
       if (abs (sum(g)) <criterio_convergencia){
             break;
       }
       x_new <- x0 - g*delta
       x_historico<- rbind(x_historico,data.frame(x=x_0[1],y=x_0[2]))
}

paste("Numero pasos", nrow(x_historico))
paste("Valor alcanzado", myfuncVector(x_0))
points (x_historico$x,x_historico$y,col="black")
color.scale.lines (x_historicosx,x_historico$y, c(1,1,0),0,c(0,1,1),colvar=1:nrow(x_historico), lwd=3)

«Numero casos 34»

«Valor alcanzado 9.54876170723182e-05»

Recuerda que todas estas temáticas abordadas, sobre la calculadora de matriz hessiana, forman parte de nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, donde podrás aprender todo lo relacionado con el mundo del Big Data e incursionar en poco tiempo en un amplio y prolífico mercado laboral. ¡Te esperamos!

Noticias recientes del mundo tech

¡CONVOCATORIA ABIERTA!

Big Data & Data Science

Full Stack Bootcamp

Clases en Directo | Acceso a +600 empresas | 98% de empleabilidad

Descárgate también el informe de tendencias en el mercado laboral 2026.

Fórmate con planes adaptados a tus objetivos y logra resultados en tiempo récord.
KeepCoding Bootcamps
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.