Juan David Velásquez Henao
jdvelasq@unal.edu.co
Universidad Nacional de Colombia, Sede Medellín
Facultad de Minas
Medellín, Colombia
[Licencia]
[Readme]
Software utilizado.
Este es un documento interactivo escrito como un notebook de Jupyter, en el cual se presenta un tutorial sobre regresión logistica usando R en el contexto de aprendizaje de maquinas. Los notebooks de Jupyter permiten incoporar simultáneamente código, texto, gráficos y ecuaciones. El código presentado en este notebook puede ejecutarse en los sistemas operativos Linux y OS X.
Haga click aquí para obtener instrucciones detalladas sobre como instalar Jupyter en Windows y Mac OS X.
Haga clic [aquí] para ver la última versión de este documento en nbviewer.
Descargue la última versión de este documento a su disco duro; luego, carguelo y ejecutelo en línea en Try Jupyter!
Haga clic aquí para ver el tutorial de visualización y gráficas.
In [ ]:
Se reconoce que el cerebro humano "computa" en uan forma totalmente diferente a un computador convencional. Se caracteriza por ser altamente complejo, tener una respuesta no lineal y procesamiento en paralelo de la información.
Algunas de sus propiedades:
- Es robusto y tolerante a fallos.
- Es flexible (capacidad de aprendizaje en nuevas situaciones).
- Puede manejar información difusa, probabilistica, ruidosa e inconsistente. Manejo inherente de la incertidumbre.
- La máquina en que se ejecutan estas funciones es altamente paralela, pequeña, compacta y disipa una pequeña cantidad de energia.
Una red neuronal es un procesador distribuido paralelamente masivo hecho de unidades simples de procesamiento el cual tiene propensión natural para almacenar conocimiento experimental y hacerlo disponible para su uso. Se asemeja al cerebro en dos aspectos:
El conocimiento es adquirido del ambiente a través de un algoritmo de aprendizaje.
Las resistencias de las conexiones interneuronales, conocidas como pesos sinápticos, son usadas para almacenar el conocimiento adquirido.
Capacidades y propiedades:
- No linealidad.
- Mapeo entrada-salida.
- Adaptabilidad.
- Respuesta evidencial.
- Información contextual.
- Tolerancia a los fallos.
- Uniformidad de análisis y diseño.
- Analogía neurobiológica.
Las redes neuronales pueden resolver problemas complejos que son intratables usando otras técnicas debido a sus capacidades de procesamiento de información:
- Estructura distribuida masivamente paralela.
- Capacidad de aprendizaje y generalización.
Normalmente las funciones sigmoideas son las mas utilizadas en las redes neuronales.$\sigma(\cdot)$ es una función sigmoidal continua y diferenciable, tal que:
- $\sigma(u)\longrightarrow \pm 1$ cuando $u \longrightarrow \pm \infty$
- $\sigma(u) \in [-1,+1]$
- $\sigma(u) = 0$ en un único punto $u=0$
- $\sigma'(u) > 0$ y $\sigma'(\cdot) \longrightarrow 0$ cuando $u\longrightarrow \pm \infty $ (monótonamente creciente)
- $\sigma'(u)$ tiene un máximo global > 0
In [2]:
## Instale y cargue las siguientes librerias
library(neuralnet)
In [3]:
## Red neuronal para calcular la raiz cuadrada de una número
## Generación números aleatorios distribuidos uniformemente entre 0 y 100
i1 <- as.data.frame(runif(50, # 50 datos
min=0, # Min = 0
max=100)) # Max = 100
o1 <- sqrt(i1) # Raiz cuadrada de los valores de entrada
In [4]:
## Unificación de los datos en un dataframe
train <- cbind(i1,o1)
colnames(train) <- c("input","output")
head(train)
In [5]:
## Entrenamineto de la red neuronal con 'neuralnet'
arn <- neuralnet(output~input,
train, # Conjunto de datos de entrenamiento
hidden=5, # Neuronas oculta en cada capa
threshold=0.01) # Criterio de parada
In [6]:
## Gráfica de la red neuronal
options(repr.plot.width=10, repr.plot.height=6)
plot(arn, # Modelo neuronal
rep="best", # Grafica de la repetición con menor error
col.entry= "Red", # Color input
col.hidden = "green", # Color de las neuronas
show.weights= T) # Mostrar valores de los pesos
In [7]:
## Test para la red neuronal
## Generación de datos de prueba
dtest <- as.data.frame (runif(10,0,100))
## Prueba del modelo neuronal
test <- compute(arn,dtest)
In [8]:
## Resultados
result <- cbind(dtest,
sqrt(dtest),
as.data.frame(test$net.result))
colnames(result) <- c("Input","Salida Esperada","Salida red neuronal")
print(result)
Ejercicio.-- Realice un modelo de red neuronal, para ajustar los siguientes datos y pruebe el modelo con los datos $x1$.
In [ ]:
In [ ]:
In [11]:
## Instale y cargue las siguientes librerías
library(quantmod)
library(nnet)
library(caret)
library(reshape)
In [12]:
## Ajuste de una serie de tiempo con ANN
In [13]:
## Datos de la serie
y <- c( 15.81,15.34,15.20,15.40,15.93,16.01,
15.73,15.35,15.15,15.37,15.53,15.82,
15.83,15.80,15.60,15.33,15.37,15.47,
15.50,15.60,15.59,15.55,15.52,15.47,
15.44,15.50,15.71,15.58,15.51,15.52,
15.66,15.65,15.58,15.53,15.45,15.60,
15.79,15.80,15.74,15.58,15.30,15.24,
15.35,15.57,15.67,15.64,15.45,15.40,
15.43,15.74,15.89,15.79,15.54,15.51,
15.46,15.46,15.68,15.68,15.54,15.40,
15.39,15.50,15.68,15.69,15.52,15.55,
15.55,15.53,15.53,15.61,15.62,15.56,
15.43,15.41,15.52,15.58,15.65,15.47,
15.42,15.35,15.44,15.56,15.58,15.57,
15.35,15.47,15.48,15.50,15.45,15.43,
15.73,15.81,15.51,15.15,15.26,15.61,
15.8,15.64,15.28,15.13)
## Variable x
t <- 1:length(y) # Longitud de la serie
options(repr.plot.width=10, repr.plot.height=5)
plot(t,y,
col = 1, # Color de linea
type = "o", # o -- overplot
lwd = 2) # ancho de la linea
grid() # agrega malla
In [14]:
## Ajuste de modelo
## Partición del conjunto de entrenamiento
y.fit1 <- y[1:80]
## Rezagos de tiempo de la serie
x1 <- y[2:(length(y.fit1)-1)] # Rezago t-1 de toda la serie
x2 <- y[1:(length(y.fit1)-2)] # Rezago t-2 de toda la serie
## Redefinición del conjunto de entrenamiento
y.fit<- y[3:length(y.fit1)]
In [15]:
## Conjunto de datos de entrenamiento
dat.fit <- data.frame( y.fit, x1, x2) # Dataframe con datos organizados
names(dat.fit) <- c('y.fit','x1','x2') # Nombre de columnas de dataframe
In [16]:
## Ajuste del modelo neuronal
set.seed(001)
m1 <- train(y.fit ~ x1+x2 , # Formula
dat.fit, # Conjunto de datos de entrenamiento
method='nnet', # Metodología
linout=TRUE, # Salida lineal
trace = FALSE) # Optimización de rastreo
fit<- fitted.values(m1) # Valores ajustados del modelo
In [17]:
## Resumen del modelo neuronal
m1
In [19]:
## Grafica del ajuste
options(repr.plot.width=10, repr.plot.height=5)
plot(t,y,
col = 1, # Color de la serie
type = "o", # o -- overplot
lwd = 2) # ancho de la linea
lines(t[3:(length(y.fit1))], # eje x
fit, # valores ajustados por red neuronal
lwd=2, # ancho de linea
col="red") # color de valores ajustados
grid() # agrega malla
In [20]:
## Variables de prueba
x1.for <- y[length(y.fit1):(length(y)-1)] # Rezago t-1 para test
x2.for <- y[(length(y.fit1)-1):(length(y)-2)] # Rezago t-2 para test
t.for <- t[(length(y.fit1)+1):(length(y))] # eje x para prueba
## Predicción
y.for <- predict(m1, # Modelo neuronal entrenado
data.frame(x1= x1.for, x2=x2.for)) # Datos de entrada para test (rezagos)
In [17]:
# Grafica de la predicción
options(repr.plot.width=10, repr.plot.height=5)
plot(t,y,
col = 1, # Color de la serie
type = "o", # o -- overplot
lwd = 2) # ancho de la linea
lines(t.for, # eje x
y.for, # valores pronostico red neuronal
lwd=2, # ancho de linea
col="red") # color valores pronosticados
grid() # agrega malla
Ejercicio.-- Desarrolle un modelo de red neuronal para ajustar y pronosticar el siguiente conjunto de datos. Utilice el 80% de los datos para entrenar el modelo y el 20% restante para probar
In [ ]:
Construcción de un combinador lineal adaptativo para pronosticar una señal durante T=132 intervalos de tiempo. La señal es definida como dk = sin(k$\pi$ /8) para k <= 64 y dk = 0.5 * sin(k$\pi$/4) para 65 <= k <= 132. Adicionalmente, la señal esta contaminada con una fuente de ruido blanco cuya desviación estandar es $\sigma$= 0.01. Note que en la gráfica puede apreciarse el cambio de periodo y amplitud en la señal a partir de k > 64
In [21]:
T <- 160
d <- c( sin((1:64)*pi/8), 0.5 * sin((65:132)*pi/4)) + 0.01 * rnorm(132)
options(repr.plot.width=10, repr.plot.height=5)
plot(d,
col = 1, # Color de la serie
type = "l", # l -- lines
lwd = 2) # ancho de la linea
grid()
In [22]:
## Valores iniciales de las variables
L <- 5 # las entradas corresponden a los L retardos de la serie
y <- rep(0, 132) # Vector de salida
e <- rep(0, 132) # Vector para el error
w <- rep(0, L+1) # Vector para los pesos de la red
alpha <- 0.8
In [23]:
## Implementación del algoritmo de entrenamiento
for (k in (L+1):132) #El algoritmo se ejecuta para L + 1 <= k <= 132, ya que para k <= L no hay datos
{
#crea el vector x. Este paso es innecesario y solo se realiza para
#conservar la relación del ejemplo con la notación.
x = c(1, d[(k-1):(k-L)])
## calcula el pronostico
y[k] <- sum(x * w) # Suma de pesos w por valores x
## calcula la corrección
e[k] <- d[k] - y[k] # Cálculo de error
w <- w +alpha * e[k] / sum(x^2) * x # Corrección para los pesos de la red
}
In [24]:
## Gráfica de resultados
options(repr.plot.width=10, repr.plot.height=5)
plot(d,
col = 1, # Color de la serie
type = "l", # l -- lines
ylim = c(min(y,d), max(y,d)), # Limite eje y
lwd = 2) # ancho de la linea
lines(y, # Valores ajustados
lwd=2, # ancho de linea
col="red") # color valores pronosticados
grid()
Ejercicio.-- Construya un combinador lineal para ajustar el siguiente conjunto de datos. Utilice:
In [ ]: