In [1]:
%%HTML<style>div.prompt {display:none}</style>

TensorFlow, Mini-Batch/Stochastic GradientDescent With Moment

In [2]:
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
%matplotlib inline
import sys
import time
In [4]:
import gradient_descent_with_momentum as gdt

Input

Generamos la muestra de grado 4

In [5]:
grado=4
tamano=100000
x,y,coeficentes=gdt.generar_muestra(grado,tamano)
print ("Coeficientes: ",coeficentes)
plt.plot(x,y,'.')
Coeficientes:  [-0.65240887 -3.8030396   4.9922934  -1.49568513]
Out[5]:
[<matplotlib.lines.Line2D at 0x7f0a71bdfb00>]

Problema

Calcular los coeficientes que mejor se ajusten a la muestra sabiendo que es de grado 4

Generamos la matriz de coeficientes de grado 4

In [54]:
train_x=gdt.generar_matriz_coeficientes(x,grado)
train_y=np.reshape(y,(y.shape[0],-1))
learning_rate_inicial=1e-2

Solucion 1: Por medio gradient descent

In [76]:
gdt.gradient_descent_with_momentum(
    train_x,
    train_y,
    num_mini_batch=1,
    learning_rate_inicial=learning_rate_inicial,
    momentum=0.0)
Iteracion 370:
	Pesos: [-0.5  -3.09  4.92 -1.75]
	ecm: 0.11996486037969589
Tiempo de calculo: 5.289718866348267
----------------------

Solución 2: Por medio mini-batch=1000 gradient descent

In [77]:
gdt.gradient_descent_with_momentum(
    train_x,
    train_y,
    num_mini_batch=10000,
    learning_rate_inicial=learning_rate_inicial,
    momentum=0.0)
Iteracion 402:
	Pesos: [-0.54 -3.21  4.94 -1.7 ]
	ecm: 0.08897928148508072
Tiempo de calculo: 0.38129377365112305
----------------------

Solución 3: Por medio mini-batch=10000 gradient descent With Moment

In [59]:
gdt.gradient_descent_with_momentum(
    train_x,
    train_y,
    num_mini_batch=10000,
    learning_rate_inicial=learning_rate_inicial,
    momentum=0.9)
Iteracion 71:
	Pesos: [-0.71 -3.64  4.94 -1.57]
	ecm: 0.03716972470283508
Tiempo de calculo: 0.14355134963989258
----------------------

Solución 4: Por medio mini-batch=1 Stocastict gradient descent With Moment

In [75]:
gdt.gradient_descent_with_momentum(
    train_x,
    train_y,
    num_mini_batch=len(train_x),
    learning_rate_inicial=learning_rate_inicial,
    momentum=0.9)
Iteracion 500:
	Pesos: [ -1.32e+12   7.54e+11  -3.85e+12  -3.30e+12]
	ecm: 2.055166457001165e+24
Iteracion 745:
	Pesos: [ -3.62e+17  -2.14e+17  -2.48e+18   2.40e+17]
	ecm: inf
Tiempo de calculo: 0.5769433975219727
----------------------

In [62]:
gdt.gradient_descent_with_momentum(
    train_x,
    train_y,
    num_mini_batch=len(train_x),
    learning_rate_inicial=1e-3, # Disminuimos la tasa de aprendizaje
    momentum=0.9)
Iteracion 478:
	Pesos: [-0.52 -3.3   4.96 -1.73]
	ecm: 0.02569892257452011
Tiempo de calculo: 0.41315317153930664
----------------------