3 votos

En el libro de texto de Bishop, ¿es exagerado el ejemplo de sobreajuste?

enter image description here

En este caso, los datos $x$ se generan aleatoriamente, y $t$ se generan ejecutando $x$ a través de una función $\sin(2\pi x)$ y, a continuación, se añade ruido gaussiano.

A continuación, el texto de Bishop intenta ajustar esos datos mediante un polinomio de 9º grado, es decir, $y(x,w) = w_o + w_1 x + \ldots + w_Mx^M$ (Se muestra en la figura)

Luego demostraron que esto da lugar a un gran error cuadrático medio para los datos de prueba.

Y la razón es que los pesos asociados a cada uno de los parámetros es extremadamente grande, algo así como $w_i = O(1000000)$

Pero, ¿se trata de una casualidad?

¿Por qué tiene que ser tan grande el peso del polinomio?

Un polinomio de 9º orden debe tener 8 protuberancias.

Eso es todo lo que necesita. Así que la curva de Bishop podría simplemente parecerse a la curva negra que he dibujado.

enter image description here

Se acabaron los pesos enormes, problema resuelto.

¿Puede alguien comentar por qué los pesos asociados al polinomio deben ser tan grandes cuando ajusto un polinomio de orden alto, en lugar de tener pesos más pequeños como la curva que he dibujado?

¿Se trata simplemente de un error de simulación en el texto de Bishop, o la resolución del problema de optimización da realmente un peso tan grande (cosa que no creo)?

Añadido: Pesos exactos como se muestra en el libro de texto.

enter image description here

Experimento: Poly-fitting en R utilizando los mismos datos

enter image description here

6voto

Dipstick Puntos 4869

Lo proporciono como respuesta, ya que es demasiado largo para un comentario.

Si quieres reproducir los resultados, tienes que utilizar los datos reales. Como se ha señalado en los comentarios, si no se hubiera proporcionado una semilla para el generador aleatorio, otra muestra aleatoria obtenida mediante el mismo procedimiento no sería equivalente a utilizar los datos originales, sobre todo porque la muestra es muy pequeña. Usted debe utilizar los datos originales y el mismo procedimiento.

Afortunadamente, esto puede hacerse fácilmente. Hay muchas herramientas tanto offline como en línea , que le permiten extraer (manual o automáticamente) de las parcelas. Como la muestra es pequeña, hacerlo manualmente lleva menos de un minuto. Aquí está el extracto:

  0, 0.3431578947368421
  0.11133603238866399, 0.8273684210526313
  0.222672064777328, 1.0084210526315789
  0.3340080971659919, 0.9705263157894736
  0.4443319838056681, 0.12842105263157877
  0.5556680161943321, 0.16210526315789453
  0.6680161943319839, -0.8526315789473684
  0.7783400809716601, -0.4526315789473685
  0.888663967611336, -0.5705263157894738
  1, 0.25473684210526315

Si utilizas el código de la respuesta de Mark White, pero teniendo en cuenta que R utiliza polinomios ortogonales, mientras que Bishop utiliza polinomios brutos, como se indica en el comentario de @civilstat, obtendrás resultados muy parecidos a los del libro de Bishop.

ggplot(mapping = aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE, formula = y ~ poly(x, 9, raw = TRUE)) +
  coord_cartesian(ylim = c(-1, 1))

enter image description here

Lo que vale la pena destacar, es que Bishop utiliza este ejemplo para demostrar que es posible encontrar un modelo que se ajuste a los datos, mientras que el sobreajuste pero no afirma que esta solución sea óptima en ningún sentido. La cuestión es simplemente que el hecho de que su modelo se ajuste a los datos de entrenamiento no prueba que sea un buen modelo. El ejemplo no es exagerado en el sentido de que si se utiliza un algoritmo de optimización para encontrar el mejor ajuste para un polinomio de noveno grado, entonces esto es lo que el algoritmo encuentra como solución óptima dadas las restricciones. Su línea dibujada a mano no es un polinomio, a menos que pueda encontrar los parámetros que se ajustan polinomio que tiene un ajuste perfecto que se parece a esto, ¿puede usted?

3voto

Harald Puntos 24

Un polinomio de 9º orden debe tener 8 protuberancias.

Eso es todo lo que necesita. Así que la curva de Bishop podría simplemente parecerse a la curva negra que he dibujado.

Cuando trazamos una curva a ojo, tendemos a dibujar algo más parecido a una spline: un a trozos -solución polinómica a un problema de optimización que penaliza las curvas irregulares en favor de curvas más suaves.

De hecho, con la ayuda de los datos de ejemplo de @mark-white, podemos pedir a la función smooth.spline() de R que ajuste un spline de suavizado cúbico. Utilizando tantos grados de libertad como puntos de datos, el spline interpolará y obtendremos una curva muy parecida a la curva negra dibujada a mano.

dat <- data.frame(
  x = seq(0, 1, length.out = 10), 
  y = c(.3, .8, 1, .95, .1, .15, -.8, -.5, -.6, .25)
)
plot(dat$x, dat$y)
ss = smooth.spline(dat$x, dat$y, df = nrow(dat))
lines(predict(ss, x = seq(0, 1, length = 100)))

SmoothingSpline

¿Puede alguien comentar por qué los pesos asociados al polinomio deben ser tan grandes cuando ajusto un polinomio de orden alto, en lugar de tener pesos más pequeños como la curva que he dibujado?

¿Se trata simplemente de un error de simulación en el texto de Bishop, o la resolución del problema de optimización da realmente un peso tan grande (cosa que no creo)?

Como han demostrado las otras respuestas, los pesos extremos y la naturaleza dentada del polinomio de Bishop son correctos para este conjunto de datos. Lo que has dibujado no se ajusta mal a los datos, pero también no es un único polinomio. Tal y como yo lo entiendo, el spline de suavizado dibuja curvas cúbicas separadas entre cada par de puntos de datos y se asegura de que la curva global parezca suave haciendo coincidir las derivadas donde se encuentran las cúbicas. Dado que el polinomio único de Bishop no tiene esta naturaleza a trozos, no parece tan suave como la spline o tu boceto. Aunque la estimación de la spline regularizada todavía se ajusta en exceso en comparación con la curva seno real, no es tan mala como el polinomio.

En otras palabras: El ejemplo de Bishop no es una exageración, y el sobreajuste es un problema real, pero tenemos algunas formas de mitigarlo.

2voto

Mark White Puntos 569

He calculado y aproximado los datos en R:

dat <- data.frame(
  x = seq(0, 1, length.out = 10), 
  y = c(.3, .8, 1, .95, .1, .15, -.8, -.5, -.6, .25)
)

No estoy seguro de lo que quieres decir con que los pesos son grandes; parece que tu notación se refiere a los coeficientes. No son tan grandes:

> as.matrix(lm(y ~ poly(x, 9), dat)$coef)
                   [,1]
(Intercept)  0.16500000
poly(x, 9)1 -1.26335592
poly(x, 9)2  0.15231795
poly(x, 9)3  1.33490536
poly(x, 9)4  0.03646293
poly(x, 9)5 -0.04117661
poly(x, 9)6  0.13039857
poly(x, 9)7  0.04127680
poly(x, 9)8  0.15800604
poly(x, 9)9  0.50725754

Parte de la razón por la que la línea tiene un aspecto tan salvaje es que el eje y está limitado a -1 y 1. Podemos trazar un polinomio de noveno orden con y sin tener un límite en el eje y:

ggplot(dat, aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE, formula = y ~ poly(x, 9))

enter image description here

ggplot(dat, aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE, formula = y ~ poly(x, 9)) +
  coord_cartesian(ylim = c(-1, 1))

enter image description here


Disculpas, leí demasiado rápido y no vi el $\sin(2\pi x)$ poco. El comentario de Chris Haug es probablemente correcto. No puedo reproducirlo correctamente:

x <- seq(0, 1, length.out = 10)
y <- sin(2 * pi * x)

as.matrix(lm(y ~ poly(x, 9))$coef)

                     [,1]
(Intercept) -9.645959e-17
poly(x, 9)1 -1.361193e+00
poly(x, 9)2 -4.462868e-16
poly(x, 9)3  1.606816e+00
poly(x, 9)4 -2.927905e-16
poly(x, 9)5 -2.552363e-01
poly(x, 9)6  1.293542e-16
poly(x, 9)7  1.222198e-02
poly(x, 9)8  2.953532e-16
poly(x, 9)9 -1.487057e-04

ggplot(mapping = aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE, formula = y ~ poly(x, 9))

enter image description here

Me temo que el código de números aleatorios que has escrito en el comentario tampoco funcionará, ya que no hay ninguna semilla aleatoria que garantice que todo sea igual de una simulación a otra.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X