Regressão Linear com Octave

Introdução

No post/tutorial dessa semana vamos entrar de vez no mundo do “Aprendizado de Máquina”! A primeira técnica que aprenderemos é a Regressão Linear Simples. Como o próprio nome já diz, esta é uma técnica básica, mas interessante para o entendimento de alguns conceitos básicos de fundamental importância para o aprendizado das técnicas mais avançadas.

Espero que gostem.

Regressão Linear Simples

Esse tipo de técnica é uma abordagem utilizada para modelar a relação entre uma variável dependente e uma variável de entrada x. Ou seja, a partir de um conjunto de dados tentamos criar uma hipótese de como as variáveis se comportam dado os valores de entrada x. Tá, mas pra que isso serve? Simples, uma vez que tivermos essa hipótese/modelo definida, podemos prever os valores de dados novos valores de x, que não estavam antes no conjunto de dados. Agora as coisas estão interessantes, não?

Essa regressão linear é chamada simples porque só utilizaremos uma variável de entrada (variável explicatória) x, mas existem outros modelos que trabalham com múltiplas variáveis – sim, vamos trabalhar com eles também –.

Um pouco de matemática

Com essa intuição de como uma regressão funciona podemos entrar um pouco na matemática, não? Para criarmos essa hipótese/modelo, de como a variável se comporta diante do x, nós usaremos uma função polinomial da seguinte forma:

h(x,w) = w_{0} + w_1x + w_2x^2 +...+ w_Mx^M = \sum\limits_{j = 0}^M w_jx^j

Onde:

M = é a ordem do polinômio

x^{j} = x elevado a potência j

w_0 ... w_M = são os coeficientes do polinômio ( mais tarde começaremos a chamá-los de pesos)

Nosso objetivo com esse polinômio é achar os valores dos coeficientes que melhor se encaixam na função, nós faremos isso minimizando uma função de erro que mede a discrepância  da nossa hipótese h(x,w) , para qualquer valor de w, e os valores dos dados de treino. Então nossa ideia é a seguinte:

Escolher os coeficientes w para que nossa hipótese h(x,w) seja próxima de t dado os nossos dados de treino (x,t).

Como já disse antes, um dos jeitos de se definir os valores de w é minimizando-se uma função de erro. A função de erro que utilizaremos hoje, uma das mais utilizadas no mundo, é chamada de soma dos quadrados dos erros. Essa função é dada da seguinte forma:

E(w) = \frac{1}{2} \sum\limits_{n=1}^N (h(x,w) - t_n)^2

Esta fórmula resolve a maioria dos problemas de regressão linear, e é bastante eficiente para se encontrar os melhores valores de w.

Com essas intuições e fórmulas, podemos ir para a parte interessante, programar!

Conseguindo os dados

Bom para começarmos a criar hipóteses/modelos precisamos primeiro de um data set, certo? O conjunto de dados que escolhi para começarmos é um conjunto pequeno, de fácil visualização, ideal para começarmos. O link para o conjunto é este:

http://college.cengage.com/mathematics/brase/understandable_statistics/8e/students/datasets/slr/ascii/slr11.zip

A fonte desses dados é essa aqui.

Como eu gosto muito de pizza, escolhi um data set que é constituído dos dados de custo para se abrir uma franquia de pizzaria, os dados são divididos em :

= taxa de franquia anual

= custo inicial de uma franquia

Esse conjunto é constituído de dois arquivos .txt, o arquivo “slr11l1.txt” é a nossa variável x, e o arquivo “slr11l2.txt” será nossa variável t.

Now show me the code

Vamos começar logo para a parte interessante então, mude seu diretório de trabalho no workspace para a pasta onde você salvou extraiu os arquivos .zip. Comando “cd /caminho_para_sua_pasta”. Estando no diretório dos arquivos, vamos carregar os dados dos arquivos .txt em variáveis do Octave, fazemos isso da seguinte maneira:

octave:1> x = load('slr11l1.txt')
x =

 25.0000
 8.5000
 35.0000
 15.0000
 10.0000
 30.0000
 10.0000
 50.0000
 17.5000
 16.0000
 18.5000
 7.0000
 8.0000
 15.0000
 5.0000
 15.0000
 12.0000
 15.0000
 28.0000
 20.0000
 20.0000
 15.0000
 20.0000
 25.0000
 20.0000
 3.5000
 35.0000
 25.0000
 8.5000
 10.0000
 10.0000
 25.0000

octave:2> t = load('slr11l2.txt')
t =

 125.000
 80.000
 330.000
 58.000
 110.000
 338.000
 30.000
 175.000
 120.000
 135.000
 97.300
 50.000
 55.000
 40.000
 35.000
 45.000
 75.000
 33.000
 55.000
 90.000
 85.000
 125.000
 150.000
 120.000
 95.000
 30.000
 400.000
 148.000
 135.000
 45.000
 87.000
 150.000

Que tal plotarmos os dados para termos uma visão melhor?

octave:3>  plot(x,t,'xr');hold on; xlabel('Taxa de Custo Anual'); ylabel('Custo para se iniciar a franquia');

Isso nos gera o seguinte gráfico: data_plot1 Sabendo como nossos dados estão distribuídos devemos agora definir o valor da variável w para criarmos a nossa hipótese/modelo de regressão, certo? Acontece que agora vamos dar um jeito de facilitar as coisas, isso é, otimizar o processamento do Octave. Em vez de criarmos um for loop para interagirmos em cada valor de faremos isso de forma vetorizada – memoriza esse nome, utilizaremos muito ele no futuro – , isso quer dizer que multiplicaremos todos os valores de e de uma só vez, aumentando a velocidade de processamento, pois o Octave foi feito para este tipo de operação! Bom para fazermos isso, utilizaremos a normal equation, ela é feita da seguinte forma:

E(w) = (x^T * x)^{-1} * x^T * t

No Octave o código é o seguinte:

octave:4> w = (pinv(x'*x))*x'*y
w = 6.2525

Pronto! Encontramos o melhor valor de w! Então nossa hipótese/modelo ficará da seguinte maneira:

h(x,w) = \sum\limits_{ j=0}^M 6.2525*x^j

Vamos plotar nossa hipótese/modelo junto com os dados de treino para termos uma visão da nossa criação? O código é o seguinte:

octave:5> h = w*x;
octave:6> plot(x, h);hold on; plot(x,t,'xr')

Temos como saída o seguinte gráfico: data_plot2

Conclusão

Então é isso! Criamos nossa primeira hipótese/modelo baseado em um conjunto de dados com regressão linear de apenas uma variável, legal não? Essa técnica é básica, introdutória, para adentrarmos em modelos infinitamente mais complexos que este e sermos capazes explicar nossos dados com mais precisão, eficiência e com níveis maiores de abstração.

Espero que tenham gostado, qualquer dúvida, sugestão ou opinião sempre será bem vinda!

 

Publicidade

3 comentários sobre “Regressão Linear com Octave

  1. Pingback: Regressão Linear com Octave | Mineração de Dados

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s