Quadrados M´ınimos

Propaganda
Quadrados Mı́nimos
Paulo J. S. Silva
3 de junho de 2016
1
Introdução
Um dos temas principais de problemas numéricos é a obtenção de funções, ou leis, que ajustem dados
experimentais. Por exemplo, imagine que temos dados experimentais de um fenômeno que pode ser explicado
por um polinômio do segundo grau. Mesmo que o fenômeno seja perfeitamente explicável por esse tipo de
função os erros de medidas nunca vão nos permitir observar exatamente o gráfico da verdadeira função.
Vamos simular isso no código abaixo.
In [ ]: using PyPlot
# Uma funç~
ao do segundo grau.
lei(x) = π*x.^2 + 2.0.*x + 1.73
# Vamos simular medidas reais de valores da funç~
ao introduzindo um erro aleatório
# em [-5, 5].
n_pontos = 500
x = linspace(-4, 4, n_pontos)
medida = lei(x) + 10*(rand(n_pontos) - 0.5)
scatter(x, medida)
Ao observar a figura acima podemos ter a intruição que o valor medido vem de fato de um polinômio
do segundo grau. Mas como descobrir qual é esse polinômio. Ou seja, como recuperar os coeficientes
a2 = π, a1 = 2, a0 = 1.73? Este é o assunto dessa parte do curso.
2
Modelando o problema de ajuste polinômios de grau 2
Vamos tentar achar uma formulação matemática razoável para o problema e depois resolvê-lo. O que temos
são medidas com erros de função p cujo o formato geral conhecemos
p(x) = a2 x2 + a1 x + a0 ,
para coeficientes a2 , a1 , a0 que não conhecemos. Desejamos descobrir os valores dos seus coeficientes a2 , a1
e a0 . A informação que temos disponı́vel são medidas (xi , yi ), i = 1, . . . , m e que yi = p(xi ) mais algum
tipo de ruı́do aleatório. Note que se não houvesse o ruı́do aleatório, isso é se tivéssemos o valor exato
do polinômio desejado a solução seria simples. Bastaria pegar três pontos do plano e encontrar o (único)
polinômio do segundo grau que passa por eles. Veremos como fazer esse isso na próxima parte do curso.
Note que quaisquer que fosse os três pontos escolhidos irı́amos obter o mesmo polinômio.
No caso de erros de medidas na função fica impossı́vel usar a ideia acima já que o polinômio iria mudar
um pouco dependendo de quais três pontos fossem escolhidos. Nesse caso, uma ideia razoável nesse caso
é procurar qual o polinômio do segundo grau que melhor se “encaixa” a todos os dados ao mesmo tempo.
Como fazer isso matematicamente?
Dado um i = 1, . . . , m, o erro de uma função p com respeito ao valor medido em um único ponto xi é
|p(xi ) − yi |.
1
Para levar em consideração todos os pontos, os erros em todos eles devem ser combinados de alguma
forma. Uma maneira natural é pensar em dois vetores do Rm . O primeiro representa os valores medidos y = (y1 , y2 , . . . , ym ) e o segundo a função p nos respectivos pontos p = (p(x1 ), p(x2 ), . . . , p(xm )). O que
gostarı́amos é que y = p mas devido aos erros isso é impossı́vel. Podemos então buscar os coeficientes a2 ,
a1 e a0 que minimizem a distância entre y e p, já que isso leva em conta todas as coordenadas. Ou seja
queremos encontrar os coeficientes para os quais
kp − yk2
é o menor possı́vel. Uma coisa interessante é que minimizar a norma euclidiana ou o seu quadrado dá a
mesma resposta. Já a norma euclidiana ao quadrado tem a vantagem de ser diferenciável o que poderemos
explorar ao resolver o problema.
Chegamos finalmente ao seguinte problema:
Encontre coeficientes a2 , a1 , a0 de modo que ao definirmos a função p(x) = a2 x2 + a1 x + a0 o valor de
m
X
(p(xi ) − yi )2 = kp − yk2
(1)
i=1
seja o menor possı́vel.
3
Ajuste linear de curvas
Uma observação importante é que o fato da função que desejamos ajustar aos dados medidos ser um polinômio
de grau 2 desempenhou um papel secundário na dedução do problema final acima. A mesma ideia poderia
ser aplicada para ajustar um polinômio de grau 5, por exemplo. Mais ainda se função que desejamos ajustar
é uma soma de senos e cossemos como
c0 sin(x) + c1 cos(x) + c2 sin(2x) + c3 cos(2x)
o mesmo problema faz sentido e a modelagem é basicamente a mesma.
De uma maneira geral, considere que temos n funções φ1 , φ2 , . . . , φn que acreditamos que se se combinam
de forma linear para definir uma função φ. Isto é, acreditamos que φ tem a forma
φ(x) = c1 φ1 (x) + c2 φ2 (x) + . . . + cn φn (x)
usando um vetor de coeficientes c = (c1 , c2 , . . . , cn ) ∈ Rn . Considere também que temos um conjunto de
medidas (xi , yi ), i = 1, . . . , m que representam, aproximadamente, avaliações da função φ com o formato
acima.
Podemos então desejar encontrar os coeficientes que definem a função φ que melhor se ajusta aos dados
no sentido de minimizar
kφ − yk2 ,
em que y é o vetor de medidas y = (y1 , y2 , . . . , ym ) e φ o vetor da função φ(·) avaliado nos pontos xi , i =
1, 2, . . . , m:

 

φ(x1 )
c1 φ1 (x1 ) + c2 φ2 (x1 ) + . . . + cn φn (x1 )
 φ(x2 )   c1 φ1 (x2 ) + c2 φ2 (x2 ) + . . . + cn φn (x2 ) 

 

φ=
=
.
..
..




.
.
φ(xm )
c1 φ1 (xm ) + c2 φ2 (xm ) + . . . + cn φn (xm )
Escolhemos o critério de minimizar a norma euclidiana elevada ao quadrado por que assim a função que
desejamos minimizar é diferenciável.
Obtemos assim o problema de encontrar um vetor de coeficientes c = (c1 , c2 , . . . , cn ) tal que ao definirmos
a função φ(x) = c1 φ1 (x) + c2 φ2 (x) + . . . + cn φn (x) o valor de
m
X
(φ(xi ) − yi )2 = kφ − yk2
i=1
2
(2)
seja o menor possı́vel.
Para sermos capaz de realizar essa tarefa temos que entender como a expressão acima varia com os
coeficientes no vetor c. Para isso vamos usar um pouco de notação matricial. Se olharmos a segunda fórmula
acima e tentarmos entender o que ela diz colocando c em destaque temos:



 
c1
φ1 (x1 ) φ2 (x1 ) . . . φn (x1 )
φ(x1 )
 φ(x2 )   φ1 (x2 ) φ2 (x2 ) . . . φn (x2 )   c2 



 
(3)
φ=
  ..  .
=
..
..
..
..
..





. 
.
.
.
.
.
cn
φ1 (xm ) φ2 (xm ) . . . φn (xm )
φ(xm )
{z
} |
{z
} | {z }
|
Φ
φ
c
Como sugerido acima, podemos definir a matriz Φ como a matriz acima, ou seja a matriz que contém
na primeira coluna a função φ1 avaliada nos pontos x1 , x2 , . . . , xm , depois na segunda coluna a função φ2
avaliada nos mesmos pontos e assim sucessivamente. Com isso podemos escrever essa última expressão na
forma compacta
φ = Φc.
Assim, a função que queremos minimizar pode ser escrita tornando explı́cita sua dependência no vertor de
coeficientes como
f (c) = kΦc − yk2 = (Φc − y)t (Φc − y) = ct Φt Φc − 2ct Φt y − y t y.
Como desejamos minimizar a função f : Rn → R podemos usar os nossos conhecimentos de cálculo. Em
primeiro lugar, observe que a função cresce de forma quadrática com c, logo para c grande ela passará a
crescer até infinito se a norma de c crescer indefinidamente. Logo ela atinge mı́nimo. Agora, sabemos de
cálculo que os candidatos a ponto de mı́nimo devem obedecer à esquação
∇f (c) = 0.
Precismos descobrir como calcular a derivada de f . Para isso observe as seguintes regras de derivação que
são facilmente demonstradas a partir das respectivas fórmulas.
1. Se g(c) = ct Ac, para alguma matriz quadrada A, então ∇g(c) = 2Ac.
2. Se h(c) = ct b = bt c, para algum vetor b, então ∇h(c) = b, um vetor constante.
3.1
Equações normais
Aplicando as regras de cálculo acima para obter o gradiente de f :
∇f (c) = 2Φt Φc − 2Φt y.
Assim a equação que caracteriza o mı́nimo é
0 = ∇f (c) = 2Φt Φc − 2Φt y.
Ou escrevendo de uma forma mais simples, eliminando a constante 2,
Φt Φc = Φt y.
Um sistema de equações lineares em c com n equações e n incógnitas que aprendemos a resolver anteriormente.
Esse tipo de sistema é conhecido como equação normal associada ao problema de quadrados mı́nimos.
Em particular se a matriz do sistema Φt Φ for inversı́vel sabemos que haverá uma única solução que será
necessariamente então o mı́nimo da função f .
Nos problemas que vamos enfrentar é natural imaginar que a matriz Φt Φ é inversı́vel. Isso somente não
ocorrerá se uma das funções φ1 , φ2 , . . . , φm for redundante (poder ser vista como uma combinação linear das
outras, pelo menos nos pontos x1 , x2 , . . . , xn .). Para ver isso é necessário usar um pouco de álgebra linear,
fugindo um pouco do escopo de curso introdutório.
Estamos prontos para resolver o problema do inı́cio da discussão e usar o vetor medida para tentar
recuperar a função lei. Vamos começar criando a matriz Φ.
3
In [ ]: # Constroi uma matriz concatenando uma coluna de 1’s de dimens~
ao adequada, o vetor x e depois o
Φ = [ones(n_pontos) x x.^2];
In [13]: # Resolve a equaç~
ao normal Φ’Φ c = Φ’ medida, usando o operador \ de Julia
c = (Φ’*Φ) \ (Φ’*medida)
Out[13]: 3-element Array{Float64,1}:
1.71444
1.97455
3.13709
Veja como os valores se aproximam dos valores originais que eram 1.73 para o termos constante, 2 para
o coeficiente de x e π para o coeficiente associado a x2 . Outra coisa interessante de fazer é mostrar o gráfico
da função final obtida e mostrar como ele se ajusta bem nos pontos medidos.
In [27]: # Define a funç~
ao φ a partir dos coeficientes calculados e das funç~
oes originais 1, x, e x^2.
phi(x) = c[1].*1 + c[2].*x + c[3].*x.^2
# Plota os pontos medidos e o gráfico da funç~
ao obtida.
scatter(x, medida)
plot(x, phi(x), linewidth=4, color="r", label="φ")
legend()
Out[27]: PyObject <matplotlib.legend.Legend object at 0x7f87ba988650>
4
In [ ]:
In [ ]:
5
Download