No exercício anterior, usamos o método do gradiente descendente para encontrar o vetor de pesos $w$.
Aqui iremos usar a solução analítica, expressa na forma matricial por $w = (X^T\,X)^{-1}\,X^{T}\,y$.
Lembre que
$X$ é uma matriz $N \times 2$
$y$ é uma matriz (vetor) $N \times 1$
Fazer a leitura de dados (os mesmos do Exercício 1-1) e calcular o vetor de pesos $w$ ótimo de acordo com a equação acima.
In [ ]:
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
# leitura e preparação dos dados
fname = 'data1.txt'
data = np.loadtxt(fname, delimiter = ',')
N = data.shape[0]
X = data[:, 0]
y = data[:, 1]
X = np.vstack(zip(np.ones(N), X))
# cálculo da transposta de X e inversa, antes do cálculo de w
XT = np.transpose(X)
TMP = np.linalg.inv(XT.dot(X))
w = TMP.dot(XT.dot(y))
print w
# Plot the linear fit
plt.plot(X[:,1], y, 'rx')
plt.plot(X[:,1], X.dot(w), '-')
plt.xlim(-1, 10)
plt.ylim(-1,6)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
Vamos comparar o custo final obtido aqui com o obtido no Exercício 1-1.
Para isso, você já devrá ter criado o arquivo funcoes.py com a função computeCost
Qual dos métodos resultou em custo menor ?
In [ ]:
from funcoes import computeCost
finalCost = computeCost(X, y, w)
print 'Final cost: ', finalCost