Вы находитесь на странице: 1из 7

Estimación y Predicción con Redes Neuronales

Vı́ctor Chaparro Parra

Minerı́a de Datos

1. Representación gráfica de la función a estimar

Consideramos la función y ≡ f (x) = x sin x. Para representarla gráficamente primero generamos


200 puntos comprendidos entre -2π y +2π, después calculamos el valor de y para cada uno de los puntos
x y dibujamos y vs. x:

> x = seq(-2*pi, 2*pi, length = 200)


> y = x*sin(x)
> plot(x, y, type = "l", cex.lab = 1.5, ylab = "y = x·sin(x)")

La representación de la función puede verse en la figura 1


2
1
0
y = x·sin(x)
−1
−2
−3
−4
−5

−6 −4 −2 0 2 4 6

Figura 1

Si dibujamos la función sin especificar el parámetro type = “l” obtenemos una gráfica discreta donde
se representa con un punto cada par (xi , yi ≡ f (xi )) con i = 1, . . . , 200:

1
2
1
0
y = x·sin(x)
−1
−2
−3
−4
−5

−6 −4 −2 0 2 4 6

Figura 2

A priori una red neuronal sı́ podrá estimar esta función ya que, de acuerdo al teorma de Cybenko,
un MLP (perceptrón multicapa) con sólo una capa oculta es capaz aproximar uniformemente cualquier
función continua con el grado de precisión deseado. La función en estudio es continua por lo que es
aplicable el teorma de Cybenko. La precisión deseada dependerá del cálculo adecuado de los pesos de
la red y/o del número de neuronas utilizado en la capa oculta.

2. Ajuste a un modelo lineal

Ya observando las gráficas de las figuras 1 y 2 podemos aventurarnos a decir, sin miedo a equivo-
carnos, que la relación entre y y x no es lineal. En cualquier caso, en esta sección se estudia si el ajuste
de los datos (xi , yi ) a un modelo lineal es adecuado o no.
Para ajustar los datos a un modelo lineal utilizamos la función lm de R, y mediante la función
summary se obtienen los resultados del ajuste:

> y.lm <- lm(y~x)


> summary(y.lm)

Call:
lm(formula = y ~ x)

Residuals:
Min 1Q Median 3Q Max
-3.8188 -2.2908 0.9952 2.0555 2.8136

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -9.947e-01 1.637e-01 -6.075 6.26e-09 ***

2
x -1.163e-16 4.491e-02 0.000 1
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.316 on 198 degrees of freedom


Multiple R-squared: 8.361e-32, Adjusted R-squared: -0.005051
F-statistic: 1.655e-29 on 1 and 198 DF, p-value: 1

En la figura 3 aparece la recta de ajuste, que se puede añadir a la gráfica de y vs. x mediante el
comando
> plot(x, y, cex.lab = 1.5)
> abline(y.lm, col = 2)
2
1
0
−1
y
−2
−3
−4
−5

−6 −4 −2 0 2 4 6

Figura 3

El coeficiente de x es prácticamente cero, por lo que la recta de ajuste es una lı́nea horizontal que
intercepta al eje de ordenadas en y = −0.947, es decir, los valores de y no dependen de x en este modelo.
Por otro lado, como era de esperar, con el valor obtenido de R2 (0.5 %) y un p-valor conjunto de 1 (se
acepta la hipótesis nula de independencia lineal) se concluye que no hay ninguna relación lineal entre
los valores de x y los de y y el modelo es totalmente inaceptable en este caso. No merece la pena un
análisis más detallado, como pudiera ser la distribución de los residuos, porque el resultado del ajuste
no deja lugar a dudas.

3. Estimación mediante modelo de Red Neuronal: Perceptrón Mul-


ticapa

En esta sección se utiliza el Perceptrón Multicapa para estimar y en función de los 200 puntos x.
Concretamente se utilizan redes de 1 a 10 neuronas en la capa oculta. En R es necesario cargar la liberia
nnet para realizar los cálculos.

3
Para una red con una neurona en la capa oculta utilizamos la instrucción nnet. Hay que ejecutar esta
orden varias veces y quedarnos con la que devuelva menor error, para evitar mı́nimos locales. La función
predict permite obtener los valores predichos mediante el modelo para cada xi , que almacenamos en
forma de matriz.

> nn.1 = nnet(x, y, rang=0.1, size=1, linout=T, maxit=10000)

# weights: 4
initial value 1266.345603
iter 10 value 750.217672
final value 749.572336
converged

> prd.1 = predict(nn.1,as.matrix(x))

Podemos representar sobre la gráfica de y vs. x la curva predicha por la red y ver de esta manera
cuán bueno es el ajuste mediante el perceptrón de una neurona:

Figura 4

Repetimos el mismo proceso para k = 2, 3, . . . , 10 neuronas. En la figura 5 se muestran las todas


curvas de ajuste obtenidas para cada perceptrón en función del número de neuronas k en la capa oculta.

4
k=1 k=2
1 2

1 2
−1

−1
y

y
−3

−3
−5

−5
−6 −4 −2 0 2 4 6 −6 −4 −2 0 2 4 6

x x

k=3 k=4
1 2

1 2
−1

−1
y

y
−3

−3
−5

−5

−6 −4 −2 0 2 4 6 −6 −4 −2 0 2 4 6

x x

k=5 k=6
1 2

1 2
−1

−1
y

y
−3

−3
−5

−5

−6 −4 −2 0 2 4 6 −6 −4 −2 0 2 4 6

x x

k=7 k=8
1 2

1 2
−1

−1
y

y
−3

−3
−5

−5

−6 −4 −2 0 2 4 6 −6 −4 −2 0 2 4 6

x x

k=9 k = 10
1 2

1 2
−1

−1
y

y
−3

−3
−5

−5

−6 −4 −2 0 2 4 6 −6 −4 −2 0 2 4 6

x x

5 5
Figura
Vemos como la curva va ajustándose cada vez mejor a medida que aumentamos el número de
neuronas en la red. A partir de k = 4 neuronas, la curva se ajusta a los puntos perfectamente, no
variando apenas para k > 4. Por tanto, el número mı́nimo de neuronas necesario en la capa oculta para
predecir correctamente es de 4.

4. Representación gráfica de la red

En R la libreria neuralnet permite obtener una representación de la topologı́a de las redes. El


perceptrón de una neurona en la capa oculta se obtiene ejecutando la siguiente sentencia:

> red.1 = neuralnet(y~x, cbind(x,y), hidden=1, rep=1)


> plot(red.1)

Figura 6: Perceptrón de una neurona.

Sin más que cambiar el parámetro hidden poniéndolo a 3 en la función neuralnet se obtiene el
perceptrón de 3 neuronas:

6
Figura 7: Perceptrón de tres neuronas.

Вам также может понравиться