Solucao com o TensorFlow

In [1]:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

Os dados

In [2]:
x=np.array([-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5])
y=np.array([-53.9, -28.5, -20.7,  -3.6,  -9.8,   5.0,   4.2,   5.1,  11.4, 27.4,  44.0])
xmat=np.vstack((x**3,x**2,x,np.ones(len(x)))).T
# preciso da transposta pois vou usar o tf.multiply e nao o np.dot das outras questoes.

Place holders do TF

In [3]:
tfx= tf.placeholder("float")
tfy= tf.placeholder("float")
tfxmat=tf.placeholder("float")
In [4]:
w = tf.Variable([0.0,0.0,0.0,0.0], name="w")

previsao e erro veja que o erro é para dodos os dados e nao um dado por vez

In [5]:
pred=tf.reduce_sum(tf.multiply(w,tfxmat),axis=1)
#pred é um vetor de predicoes (para cada x)
erro = tf.reduce_sum(tf.pow(pred-tfy, 2))

define o otimizador

In [6]:
optimizer = tf.train.AdamOptimizer(0.01).minimize(erro)
In [7]:
init = tf.global_variables_initializer()

o loop de otimizacao

eu estou usando uma solucao em batch

In [8]:
with tf.Session() as sess:
    sess.run(init)

    for epoch in range(200):
        sess.run(optimizer, feed_dict={tfxmat: xmat, tfy: y})
        if (epoch+1) % 10 == 0:
            c = sess.run(erro, feed_dict={tfxmat: xmat, tfy:y})
            print("erro: "+str(c))
    c = sess.run(erro, feed_dict={tfxmat: xmat, tfy:y})
    print("erro: "+str(c))
    wend=sess.run(w)
erro: 4045.71
erro: 1983.87
erro: 841.081
erro: 350.658
erro: 212.453
erro: 198.098
erro: 201.424
erro: 199.901
erro: 196.864
erro: 195.182
erro: 194.388
erro: 193.698
erro: 192.938
erro: 192.158
erro: 191.373
erro: 190.575
erro: 189.76
erro: 188.931
erro: 188.089
erro: 187.235
erro: 187.235
O erro parece ser menor que das outras solucoes!!
In [9]:
print("w: "+str(wend))
w: [ 0.3824673  -0.17817858  0.56182384  0.00552932]
In [10]:
ypred= wend[0]*x**3+wend[1]*x**2+wend[2]*x+wend[3]
plt.plot(x, y, 'ro', label='Original data')
plt.plot(x, ypred, label='Fitted line')
plt.show()
In [ ]: