Skip to content

Latest commit

 

History

History

linear-regression

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

Regressão Linear

1 Introdução

No processo de regressão linear, busca-se a modelagem da relação linear entre variáveis, mais especificamente a relação entre a variável dependente e as independentes, também chamadas de explanatórias \cite{yamanaka}.

Em regressões lineares simples, utiliza-se apenas uma variável explanatória (eq. eq01), enquanto nas múltiplas, diversas variáveis são somadas para formar o resultado (eq. eq02).

\begin{equation} y = ax + b \end{equation}

\begin{equation} y = a_1*x_1 + a_2*x_2 + a_3*x_3 + … + b \end{equation}

Nestas equações, $y$ é a variável dependente, enquanto $x_i$ são as variáveis independentes. $a_i$ representam os coeficientes angulares e $b$, o intercepto.

Logo, para determinar o modelo que descreve tais relações, é necessário descobrir os valores dos coeficientes $a_i$ e do intercepto $b$. Para tal, algumas técnicas podem ser aplicadas. Duas delas serão citadas neste trabalho.

A primeira envolve a utilização do coeficiente de Pearson, $r$, definido pela equação eq03, abaixo. Este coeficiente determina o grau de correlação entre duas variáveis. Aliado a este, o valor de $r^2$ também é interessante, sendo conhecido como coeficiente de determinação e medindo o percentual da variação de $y$ que é explicado pela variação de $x$.

\begin{equation} r=\dfrac{∑i=1n(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{∑i=1n(x_i-\bar{x})^2} \sqrt{∑i=1n(y_i-\bar{y})^2}} \end{equation}

No geral, esta correlação entre duas variáveis pode ser positiva (quando o crescimento da variável independente é acompanhado pelo da dependente), negativa (quando o crescimento da independente ocasiona um decrescimento na dependente), não linear (a relação entre ambas não é descrita por uma equação de reta) ou sem correlação.

Pelo coeficiente de Pearson, um valor de $r < 0$ representa uma correlação negativa, enquanto $r > 0$, positiva. $r = 0$ indica que não há correlação linear entre as variáveis. Neste caso simples, é possível determinar o modelo, através das equações eq04 \cite{boston} e eq05 \cite{eberly}, abaixo:

\begin{equation} a=\dfrac{∑i=1n(x_i-\bar{x})(y_i-\bar{y})}{∑i=1n(x_i-\bar{x})^2} \end{equation}

\begin{equation} b=\bar{y}-a\bar{x} \end{equation}

A segunda técnica é uma modelagem através de um Adaline. Até o momento, alguns pesos eram descobertos, os quais descreviam uma saída por meio da relação entre as entradas multiplicadas por pesos. E é exatamente esta a definição de regressão linear. Portanto, a aplicação do Adaline para tal propósito é simples e direta.

2 Objetivos

  • Aprimorar o conhecimento sobre Redes Neurais Artificiais e obter experiência prática na implementação das mesmas.
  • Implementar um Adaline que realize a regressão linear para os dados da tabela tb01.
  • Encontrar o coeficiente de correlação de Pearson e o coeficiente de determinação para a mesma base de dados.
  • Calcular $a$ e $b$ (eq. eq04 e eq05).
  • Comparar resultados obtidos com ambas as técnicas.
xy
0.002.26
0.503.80
1.004.43
1.505.91
2.006.18
2.507.26
3.008.15
3.509.14
4.0010.87
4.5011.58
5.0012.55

3 Materiais e Métodos

Para implementação da rede neural foi utilizada a linguagem de programação Common Lisp, compilando-a com o SBCL (Steel Bank Common Lisp). Como interface de desenvolvimento, foi utilizado o Emacs em Org Mode, configurado com a plataforma SLIME (The Superior Lisp Interaction Mode for Emacs) para melhor comunicação com o SBCL. Foi utilizada uma abordagem bottom-up para o desenvolvimento. O código produzido segue majoritariamente o paradigma funcional, sendo este trabalho como um todo uma obra de programação literária. Parte das funções já foram implementadas em Regra de Hebb e Perceptron e Adaline.

4 Adaline

Inicialmente, será implementada uma função que gera a equação da reta a partir dos coeficientes. Desta forma, a função definida abaixo faz o desejado, entretanto se utiliza da função eval para a transformação da s-expression em código interpretado, técnica que em vários casos deve ser evitada 1.

1 https://stackoverflow.com/questions/2571401/why-exactly-is-eval-evil/2571549

(defun linear-regression (weights)
  (let* ((wi (butlast weights))
	 (b (first (last weights)))
	 (args (loop for nil in wi collecting (gensym))))
    (eval `#'(lambda ,args
	       (+ ,@(mapcar #'(lambda (a w)
				`(* ,a ,w))
			    args wi)
		  ,b)))))

Continuando a implementação utilizando Adaline, tem-se que os pesos (w e b), encontrados durante o treinamento, após 1000 ciclos, e com learning-rate de 0.005 são:

(iterative-training
 tb01-x tb01-y
 (random-weights 3 -1 1) 0 0.05 0 1000
 #'adaline-update #'adaline-stop-condition #'net #'adaline-activation)
2.01799422.4513268

Assim, a equação da reta (eq. eq06) seria:

\begin{equation} y = 2.0179942 x + 2.4513268 \end{equation}

Para plotagem dos pontos, a função linear-boundary deve ser adaptada, da seguinte forma:

(defun linear-between (fn min max)
  (list (list min (funcall fn min))
	(list max (funcall fn max))))

Portanto, o gráfico fig1:

(scatter-plot "plots/scatter-plot-adaline.png"
	      tb01
	      (linear-between (linear-regression w-adaline) 0 5))

./plots/scatter-plot-adaline.png

5 Pearson

Primeiramente, a função para cálculo do r e do r quadrático:

(defun average (points)
  (labels ((rec (lst i result)
	     (if lst
		 (rec (cdr lst) (1+ i) (mapcar #'+ (car lst)
					       result))
		 (values-list (mapcar #'(lambda (x)
					  (/ x i))
				      result)))))
    (rec (cdr points) 1 (car points))))

(defun r-pearson (points)
  (multiple-value-bind (av-x av-y)
      (average points)
    (loop for (x y) in points
       summing (* (- x av-x) (- y av-y)) into cov-xy
       summing (expt (- x av-x) 2) into var-x
       summing (expt (- y av-y) 2) into var-y
       finally (return (/ cov-xy (sqrt (* var-x var-y)))))))

(defun r-sqrd (points)
  (expt (r-pearson points) 2))

Utilizando-as para a tabela tb01, tem-se que o coeficiente $r$ é:

(r-pearson tb01)
0.99611324

Enquanto $r^2$ é:

(r-sqrd tb01)
0.99224156

O cálculo de $a$ e $b$, seguindo as equações eq04 e eq05 é definido da seguinte forma:

(defun simple-linear-regression (points)
  (multiple-value-bind (av-x av-y)
  (average points)
    (loop for (x y) in points
       summing (* (- x av-x) (- y av-y)) into s
       summing (expt (- x av-x) 2) into s-sqrd
       finally (let ((a (/ s s-sqrd)))
		 (return (list a (- av-y (* a av-x))))))))

Para a base de dados, temos que $a$ e $b$ são:

(simple-linear-regression tb01)
2.00581842.4518175

Portanto, a equação da reta (eq. eq07):

\begin{equation} y = 2.0058184 x + 2.4518175 \end{equation}

De forma semelhante, a impressão se dá da seguinte maneira (fig. fig2):

(scatter-plot "plots/scatter-plot-pearson.png"
	      tb01
	      (linear-between (linear-regression w-simple) 0 5))

./plots/scatter-plot-pearson.png

6 Conclusão

Ambos os algoritmos encontraram valores muito semelhantes de $a$ e $b$. Percebe-se que o valor do intercepto foi mais próximo nas duas estratégias se comparado ao valor da inclinação. Apesar deste fato, observa-se nos gráficos que ambas as retas descrevem com bastante fidelidade o conjunto de pontos.

Em relação ao valor do coeficiente, $r = 0.99611324$, verifica-se que a relação entre $x$ e $y$ é positiva ($r > 0$) e bastante forte, com $r^2 = 0.99224156%$.

\bibliographystyle{plain} \bibliography{../references}