Passo 0 para a parte prática

O conteúdo desta página está no notebook practice_basics.ipynb
Exercício recomendado se você não está familizarizado com Python

Objetivos

  • familiarizar-se com conjunto de dados (quem é $\mathbf{x}$, quem é $y$)
  • plotar pontos no plano
  • plotar curvas no plano

Como proceder: Execute cada uma das células de código abaixo. Experimente alterar alguns parâmetros ou incluir prints adicionais

1. Importar algumas bibliotecas

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

%matplotlib inline

2. Examinar, carregar, fazer plot dos dados

Arquivo exemplo: "data1.txt"

In [2]:
# O arquivo de dados é um txt no qual cada linha
# contém dois números, separados por vírgula.
# A primeira coluna é o x e a segunda coluna é o y

%pycat ../data/data1.txt
In [3]:
fname = '../data/data1.txt'
data = np.loadtxt(fname, delimiter = ',')

N = data.shape[0]  # número de linhas; portanto número de exemplos
x = data[:, 0]  # coluna 0 é o x
y = data[:, 1]  # coluna 1 é o y

# Examinar a dimensão dos arrays
print('Dimensão do array data:', data.shape)
print('Dimensão do array x:', x.shape)
print('Dimensão do array y:', x.shape)

# plotar o dados
plt.plot(x, y, 'rx')
plt.xlim(-1, 10)
plt.ylim(-1, 6)
plt.title(fname)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
Dimensão do array data: (11, 2)
Dimensão do array x: (11,)
Dimensão do array y: (11,)

3. Plot de uma reta

Gráfico da reta $f(x) = w_o + w_1x$
Experimente:

  • alterar os pesos $w_0$ e $w_1$
  • alterar o range de $x$
In [4]:
# w = (w_0, w_1)
w = np.array((1,2))
print("Dimensão do array w: ", w.shape)

# sequência de inteiros de 0 a 9
ptx = np.arange(10)
print("Pontos:", ptx)

# plotar a reta
plt.title( 'Reta %.1f+%.1fx'%(w[0],w[1]) )
plt.plot(ptx, w[0]+w[1]*ptx, '-')
plt.xlabel('x')
plt.ylabel('f( x )')
plt.show()
Dimensão do array w:  (2,)
Pontos: [0 1 2 3 4 5 6 7 8 9]

Gráfico da reta $f(x) = w_o + w_1x = \mathbf{w}^T\,\mathbf{x}$
Desta vez, valor $y$ calculado por meio de equação matricial, fazendo-se $\mathbf{x} = \left[\begin{array}{c}1 \\ x \end{array}\right]$ e calculando : $$ y = [w_0 \ \ w_1]\left[\begin{array}{c}1 \\ x\end{array}\right] $$

In [5]:
# Será usado o mesmo peso w da célula anterior. Para alterar
# descomente a linha abaixo e edite os valores
# w = np.array((1,2))

# cada ponto x será transformado no par (1,x)
ptxx = np.vstack(zip(np.ones(10), ptx))
print("Pontos estendidos = \n", ptxx)

# plotar a reta
plt.title( 'Reta %.1f+%.1fx'%(w[0],w[1]) )
plt.plot(ptx, ptxx.dot(w), '-')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.show()
Pontos estendidos = 
 [[ 1.  0.]
 [ 1.  1.]
 [ 1.  2.]
 [ 1.  3.]
 [ 1.  4.]
 [ 1.  5.]
 [ 1.  6.]
 [ 1.  7.]
 [ 1.  8.]
 [ 1.  9.]]

4. Sobrepor uma reta sobre o plot de pontos

Plotar os pares de pontos $(x,y)$ iniciais e a reta $y = w_0 + w_1x$ num mesmo gráfico. Qual é a reta que melhor se "ajusta" aos exemplos ?

In [6]:
# chutar valores para o vetor de pesos
w = np.array((5,-1/2))

# plotar os dados (x,y)
plt.plot(x, y, 'rx')

# plotar a reta f(ptx) = w_0 + w_1*ptx
plt.title( fname + ' e a reta %.1f+%.1fx'%(w[0],w[1]) )
plt.plot(ptx, ptxx.dot(w), '-')
plt.xlim(-1, 10)
plt.ylim(-1, 6)
plt.xlabel('x')
plt.ylabel('y')
plt.show()