Regressão não linear

Regressão não linear (parte 1)

Uma regressão não linear é o processo de estimação dos parâmetros de um modelo não linear para que ele se ajuste da melhor forma possível a um conjunto de dados segundo um determinado critério(ou métrica). A relação entre as variáveis independentes(entrada do modelo) e dependentes(saída) é estabelecida por um função não linear. No caso geral para encontrar os parâmetros do modelo não linear a utilização da matriz pseudo-inversa ou o método dos mínimos quadrados padrão não são apropriados. Assim, frequentemente, são necessários métodos de otimização de parâmetros numéricos e/ou não lineares para realizar esse tipo de regressão. Entretanto, há exceções! Na realidade, existe uma grande classe de modelos não lineares que podem ser abordados, essencialmente, como um problema de regressão linear. Neste post vamos abordar exatamente esse modelos.

Modelo linear em parâmetros

Dizemos que um determinado modelo é linear em parâmetros se podemos expressar-lo como uma combinação linear de funções não lineares e lineares. Exemplo:

\[
f([1,x_1,…,x_i,..,x_n])=\theta_0+\theta_1 g_1(x_1)+…+ \theta_i g_i(x_i)+…+\theta_n g_n(x_n) \qquad Eq.1
\]

Notem que escrevendo o sistema não linear $f$ desta forma, $g_i(.)$ pode ser qualquer tipo de função linear ou não, $f$ sempre poderá ser escrito como uma combinação linear das funções $g_i$. Ou seja:

\[
f([1,x_1,…,x_i,..,x_n])=[1,g_1(x_1),…,g_i(x_i),..,g_n(x_n)] \begin{bmatrix} \theta_0 \\ \theta_1 \\ \vdots \\ \theta_i \\ \vdots \\ \theta_n \end{bmatrix} \qquad Eq.2
\]

Considerando que a Eq.2, essencialmente é um sistema linear em relação a $g_i(x_i)$ , podemos aplicar o método dos mínimos quadrados padrão para encontrar os parâmetros $\theta_i$ do modelo não linear. Isto é fantástico, porque podemos implementar modelos não lineares bem mais complexos para tarefas de regressão e classificação utilizando, essencialmente, as mesmas ferramentas matemáticas utilizadas em modelagens lineares. Além disso, o calculo da matriz pseudo-inversa do sistema é algo trivial de ser realizado em muitas linguagens/bibliotecas de programação, como Scilab, Matlab, Octave, Python, etc. Ou seja, realizar uma regressão não linear utilizando matriz pseudo-inversa é algo que simplifica muito o trabalho de implementação de tais sistemas.

Exemplo 1

Para ilustrar a ideia de uma regressão não linear utilizando o método da matriz pseudo-inversa, imagine que você deseja realizar uma regressão para um modelo polinomial de ordem 3, como ilustrado na Eq. 3.

\[
f(x)=a x^3+bx^2+cx+d \qquad Eq.3
\]

Precisamos apenas reformular a Eq. 3 em um formato matricial conveniente, como mostrado na Eq.4, e criar uma matriz $[X]$ e $[Y]$ com os dados que desejamos modelar.

\[
f([x^3, x^2, x, 1])= [x^3, x^2, x, 1] \begin{bmatrix} a \\ b \\ c \\ d \end{bmatrix} \qquad Eq.4
\]

Abaixo segue um exemplo de código implementado no Scilab realizando uma regressão polinomial de ordem 3. Os dados para o ajuste do modelo estão nos vetores $xs$ e $ys$ respectivamente nas linhas 2 e 3 do código.

Scilab
//Amostras de pontos para realizar a regressao
xs=[-0.5   0.5   3.6   1.2  -1.9   1.8  -3.1  -1.7   2.7   0.2   1.9  -3.7   4.   1.   1.4   4.2   3.9  -1.  -1.5   3.2 ]
ys=[4.5429998   2.6870962   47.287262   8.2070131   0.8522233   8.0160801  -17.525483  -5.9770401   14.336386   6.2203205   16.714496  -27.32972   76.084843
    4.0841525   7.9312131   89.114051   61.112752   0.9220781   4.0110426   37.37927]

//Plotagem das amostras
plot(xs,ys,'o')


//Forma matricial do modelo
Ys=ys'
Xs=[xs.^3; xs.^2; xs; ones(1:Ns)]'

//Calculo da pseudo-inversa
W=pinv(Xs)*Ys

//Avaliação do modelo ajustado no intervalo -5<=x<=5
x=-5:0.1:5
X=[x.^3; x.^2; x; ones(1:N)]'
Y=X*W

//Plot do modelo ajustado
plot(x,Y','r')

xlabel("x")
ylabel("y(x)")
xtitle("www.drgomes.pro")
xgrid()

As linhas 11 e 12 apresentam como as matrizes de amostras $[Xs]$ e $[Ys]$ podem ser criadas a partir dos vetores $xs$ e $ys$ . Na linha 15, temos o calculo dos parâmetros ($[W]$) do modelo utilizando a matriz pseudo-inversa. Notem que entre calcular as matrizes de amostras e calcular a saída do modelo já ajustado para um valor arbitrário não precisa mais do que 6 linhas de código! (códigos da linha 11 até a 20).

O resultado do ajuste polinomial de ordem 3 pode ser visualizado na Figura 1.

Regressão polinomial de ordem 3.
Figura 1: Regressão polinomial de ordem 3 utilizando o método dos mínimos quadrados. As bolinhas azuis são as amostras utilizadas para fazer a regressão. A linha vermelha contínua é o modelo ajustado.

Exemplo 2

Um outro exemplo um pouco menos óbvio de modelo que é linear em parâmetros é uma função exponencial como a representada na Eq. 5.

\[
f(t)=A e^{k \cdot t} \qquad Eq.5
\]

Logicamente, que a função $f(t)$ não é linear em relação aos seus parâmetros $A$ e $k$, mas a função $ln(f(t))$ é linear em relação a $ln(A)$ e $k$. Ou seja, embora não dê para trabalhar diretamente com $f(t)$, dá para fazer a regressão em relação a $y=ln(f(t))$ e depois calcular o valor da saída da regressão como $exp(y)$. Ou seja, apenas precisamos colocar $ln(f(t))$ em um formato matricial conveniente, Eq. 6 e Eq.7, e procedermos de forma análoga ao primeiro exemplo.

\[
ln(f(t))=ln(A)+ k \cdot t \qquad Eq.6
\]

\[
ln(f([1,t]))=[1, t] \begin{bmatrix} ln(A) \\ k \end{bmatrix} \qquad Eq.7
\]

Abaixo segue um exemplo ilustrativo de regressão exponencial implementada no Scilab e utilizando o método dos mínimos quadrados com matriz pseudo-inversa para realizar a regressão.

Scilab
//Amostras de pontos para realizar a regressao
xs=[0.8   1.2   0.3   0.7   0.1   2.7   2.2   2.   1.4   1.9   2.5   1.3   2.3   0.5   0.6   1.8   1.5   2.4   0.   2.1]
ys=[8.321392   14.579982   6.400023   8.4123099   3.3995022   78.041765   42.95463   34.549355   16.238541   30.720037   61.614706   16.043707   48.195319
    6.3503569   7.2389795   26.561629   18.383841   53.660091   4.2901312   38.733253]

//Plotagem das amostras
plot(xs,ys,'o')


//Forma matricial do modelo
Ys=log(ys')
Xs=[ones(1:Ns); xs]'

//Calculo da pseudo-inversa
W=pinv(Xs)*Ys

//Avaliação do modelo ajustado no intervalo -5<=x<=5
x=0:0.1:3
X=[ones(1:N); x]'
Y=exp(X*W)

//Plot do modelo ajustado
plot(x,Y','r')

xlabel("x")
ylabel("y(x)")
xtitle("www.drgomes.pro")
xgrid()

O resultado da regressão exponencial realizada no código anterior pode ser visualizado na Figura 2.

Regressão exponencial.
Figura 2: Regressão exponencial utilizando o método dos mínimos quadrados. As bolinhas azuis são as amostras utilizadas para fazer a regressão. A linha vermelha contínua é o modelo ajustado.

Exemplo 3

Funções cossenoidais também podem ser ajustadas utilizando a mesma abordagem dos casos anteriores. Um exemplo de função cossenoidal que pode ser ajustado utilizando a abordagem discutida aqui está representada na Eq. 8. Neste caso, estamos considerando como parâmetros do sistema apenas os termos que multiplicam as funções cossenoidais e a constante $B_0$. Ou seja as componentes de “frequência” são consideradas “fixas” ou conhecidas, caso contrário não teríamos um sistema linear em parâmetros.

\[
f(t)=B_0+A_1 sen(t)+B_1 cos(t)+ A_2 sen( \frac{1}{2} t)+ B_2 cos( \frac{1}{2} t) \qquad Eq.8
\]

Rearranjando a Eq.8 em um formato matricial conveniente temos:

\[
f([1, sen(t), cos(t), sen(\frac{1}{2}t),cos(\frac{1}{2}t)])=[1, sen(t), cos(t), sen(\frac{1}{2}t),cos(\frac{1}{2}t)] \begin{bmatrix} B_0 \\ A_1 \\ B_1 \\ A_2 \\ B_2 \end{bmatrix} \qquad Eq.9
\]

Abaixo temos um exemplo de código implementado em Scilab script para realizar uma regressão cossenoidal do tipo da Eq. 9. Os dados utilizados para a regressão estão armazenados nos vetores $xs$ e $ys$. Em relação aos exemplos e códigos anteriores, basicamente, só as linhas 12 e 19 muram. Estas linhas são exatamente as representações da matriz $[X]$ de entrada do modelo. ($[Xs]$ -> Amostras de treinamento e $[X]$ -> Entrada de teste do modelo)

Scilab
//Amostras de pontos para realizar a regressao
xs=[9.2   1.2   9.   2.3   4.   0.6   2.8   2.   6.   5.3   9.1   2.5   3.   3.5   6.9   10.   0.   8.   0.7   5.0]
ys=[0.0292388   3.4176534   0.3597107   1.9615476  -0.6861153   3.2807875   1.0124053   2.5283971   1.1033451   0.0888967   0.1926728   1.592155   0.5807337
    -0.2322426   2.1591285  -0.7209141   2.5505698   1.8383272   3.3610784  -0.3620078]

//Plotagem das amostras
plot(xs,ys,'o')


//Forma matricial do modelo
Ys=ys'
Xs=[ones(1:Ns); sin(xs); cos(xs); sin(0.5*xs); cos(0.5*xs)]'

//Calculo da pseudo-inversa
W=pinv(Xs)*Ys

//Avaliação do modelo ajustado no intervalo -5<=x<=5
x=0:0.1:10
X=[ones(1:N); sin(x); cos(x); sin(0.5*x); cos(0.5*x)]'
Y=X*W

//Plot do modelo ajustado
plot(x,Y','r')

xlabel("x")
ylabel("y(x)")
xtitle("www.drgomes.pro")
xgrid()
Regressão cossenoidal.
Figura 3: Regressão cossenoidal utilizando o método dos mínimos quadrados. As bolinhas azuis são as amostras utilizadas para fazer a regressão. A linha vermelha contínua é o modelo ajustado.

Em resumo, o que podemos notar nos três exemplos anteriores é que o procedimento de regressão não linear de modelos lineares em parâmetros é simples e de fácil implementação. Essencialmente, a implementação tem três passos principais:

  1. Colocar o modelo em uma forma matricial conveniente;
  2. Calcular a matriz $[X]$ de entrada;
  3. Calcular os parâmetros do sistema com a matriz pseudo-inversa de $[X]$.

Todos os demais passos, essencialmente, são iguais para quais quer modelo de que se deseje utilizar.

That’s all folks


Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *