<jupyter_start><jupyter_text><NAME> Regressão Linear - Solução Pythônica  Regressão Linear com uma variável  Notação- **m** = número de exemplos treináveis;- **x's** = dados de entrada / características;- **y's** = dados de saída / valor esperado;- **h** = hipótese do valor de y; ![ciclo de vida da regressão linear](Imagens/ciclo-de-vida-regressao-linear.png) ![determinando a hipótese](Imagens/determinando-hipotese.png)<jupyter_code># importando as bibliotecas do python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# importando os dados
data = pd.read_csv('ex1data1.txt', names=['População', 'Lucro'])
# visualizando os 5 primeiros dados
data.head()
plt.figure(figsize = (20,10)) # definindo a dimensão do gráfico

X = data['População'].values # obtém os dados da população
Y = data['Lucro'].values # obtém os dados do lucro

m = len(Y) # número de exemplos treináveis

plt.scatter(X, Y, color = "red", marker = "*") # plotar os dados 
# aplicando as legendas ao gráfico
plt.xlabel('População da Cidade') 
plt.ylabel('Lucro da População')
plt.title('Plotando os Dados de Treinamento')
print(X)
print(Y)
X = np.append(np.ones([m,1]), X.reshape(m,1), axis=1) # adicionando x0 = 1 e ajustando a dimensão para mx1
print(X)
Y = Y.reshape(m,1) # ajustando a dimensão para mx1
Y.shape
teta = np.zeros([2,1]) # definindo uma array de zeros para armazenar os coeficientes da equação da reta
teta<jupyter_output><empty_output><jupyter_text>![objetivos da regressão linear](Imagens/objetivos-regressao-linear.png)<jupyter_code>def Custo(x, y, teta):
    '''
    Retorna o custo (erro da predição)
    '''
    m = len(y)              # número de exemplos treináveis
    
    h = x.dot(teta)        # definindo a hipótese do algoritmo
    
    J = 1/(2*m)*(np.sum((h-y)**2))             # Implementando a função de custo
    
    return J                # retorna o cursto
custo = Custo(X, Y, teta)  # Chama a função que calcula o custo e a imprime
print(custo)<jupyter_output>32.072733877455676<jupyter_text>Usando o Gradiente Descendente para minimizar o custo ![gradiente descendente](Imagens/visualizando-gradiente-descendente.png) ![agoritmo do gradiente descendente](Imagens/gradiente-descendente-algoritmo.png) ![derivadas do gradiente descendente](Imagens/gradiente-descendente-derivadas.png) ![taxa de aprendizado](Imagens/taxa-de-aprendizado.png)<jupyter_code>interacoes = 1000 # número de interações
alfa = 0.01 # taxa de aprendizado

def GradienteDescendente(x, y, teta, alfa, interacoes):
    '''
    Calculando o gradiente descendente para minizar o custo
    '''   
    historico_custo = [] # define uma lista vazia para armazenar o valor do custo em cada interação
    
    m = len(y) # número de exemplos treináveis
    
    for i in range(interacoes): # intera 1000 vezes
        
        h = x.dot(teta) # calcula a hipotese
        
        teta = teta - (alfa/m) * (x.T.dot(h-y)) # aplica o gradiente descendente
        
        historico_custo.append(Custo(x, y, teta)) # adiciona o valor do custo em cada etapa (erro de predição)
        
    return teta, historico_custo
# obtendo os parâmetros da equação da reta e o histórico do custo em cada etapa de treinamento
novo_teta, historico_custo = GradienteDescendente(X, Y, teta, alfa, interacoes)
novo_teta
historico_custo = np.array(historico_custo) # transformando a lista em um array numpy
historico_custo.shape
# definindo a dimensão do gráfico
plt.figure(figsize = (20,10))

# plotando os dados x e y no gráfico
plt.scatter(X[:,1], Y, color = "red", marker = "*") # plotar os dados 

plt.plot(X[:,1], np.dot(X, novo_teta), label = "Previsão")

plt.xlabel('População da Cidade')
plt.ylabel('Lucro da População')
plt.title('Plotando os Dados de Treinamento')

# colocando a legenda no gráfico
plt.legend()

# colocando uma grade ao gráfico
plt.grid(True)

# removendo a moldura do gráfico
plt.box(False)
def predicao(x, teta):
    '''
    Essa função retorna uma predição para novos dados
    '''
    
    pred = np.dot(x, teta)
    
    x = np.array(x)
    
    print('Para uma população de {} habitantes, teremos {} $ de lucro'.format(x[1] * 1000, pred * 10000))
    
    return None
predicao(([1, 3.5]), novo_teta)
predicao(([1, 7]), novo_teta)
plt.figure(figsize = (20, 10))
plt.plot(historico_custo)
plt.ylabel('Custo J')
plt.xlabel('Número de Interações')
plt.title('Minimizando o custo usando gradiente descendente')<jupyter_output><empty_output>
StarcoderdataJupyterStructuredCleanDedup