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.
//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.
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.
//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.
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)
//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()
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:
- Colocar o modelo em uma forma matricial conveniente;
- Calcular a matriz $[X]$ de entrada;
- 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

Deixe um comentário