Diskretni problem najmanjih kvadrata

Hide code cell source
import numpy as np;
import scipy as sc;
import matplotlib.pyplot as plt;
from scipy.optimize import curve_fit;

%matplotlib inline

4.1. Diskretni problem najmanjih kvadrata#

Opis problema Za zadanu funkciju \(f: X \to \R\) cilj je naći što bolju aproksimacijsku funkciju \(\varphi\) među svim funkcijama \(\psi\) iz određenog skupa \(\mathcal S\). U slučaju da raspolažemo nekom normom \(\| \cdot \|\), tražimo \(\varphi \in \mathcal S\) takvu da je

\[\|f - \varphi\| = \inf_{\psi \in \mathcal S} \|f - \psi \|.\]

Za razliku od problema interpolacije iz prošlog poglavlja, kriterij „bliskosti” nije u tome da funkcije \(\varphi\) i \(f\) imaju jednako djelovanje na diskretnom skupu podataka, nego da je im je udaljenost (norma razlike) što manja moguća, ali u pravilu različita od nule.

Gore opisani problem je teško zamisliti jer je dan u najvećoj mogućoj općenitosti. U ovoj lekciji pretpostavljamo sljedeće:

  • \(X\) će biti diskretan skup \(\{ t_1, t_2, \dots, t_n \} \subset \R\) - u tom slučaju gornji problem zove se diskretni problem najmanjih kvadrata;

  • \(\mathcal S\) će biti neki vektorski prostor \(V\) (najlakše je razmišljati kao prostor polinoma \(\mathcal P_m\)) – u tom slučaju pokazat će se da ovaj problem možemo riješiti eksplicitno koristeći alate iz linearne algebre, što inače nije slučaj za generalni izbor skupa \(\mathcal S\);

  • norma na domeni \(X\) bit će dana kao Euklidska norma u istaknutim točkama domene:

\[\|g\| = \left( \sum_{i=1}^n g(t_i)^2 \right)^{1/2}.\]
  • dimenzija vektorskog prostora \(V\) \(m\) bit će (mnogo) manja od broja čvorova \(n\) u domeni \(X\).

Još pojednostavljenije, pogledajmo jedan konkretan primjer.

Primjer 4.1

Klasičan problem najmanjih kvadrata je odrediti pravac \(y=ax+b\) (tj. odrediti realne koeficijente \(a,b\)) koji najbolje određuje funkciju zadanu skupom podataka \((x_i,y_i)\), \(i=1,\dots,n\). Za ovaj primjer, neka su ti brojevi dani u tablici:

\(i\)

\(x_i\)

\(y_i\)

\(1\)

\(1.0\)

\(2.5\)

\(2\)

\(2.0\)

\(3.7\)

\(3\)

\(3.0\)

\(3.5\)

\(4\)

\(4.0\)

\(4.5\)

\(5\)

\(5.0\)

\(4.9\)

Dakle, u ovom primjeru imamo

  • \(X = \{ x_1,\dots,x_n\}\);

  • \(\mathcal S = V = \{ ax+b \ : \ a,b \in \mathbb R \} = \mathcal P_1\);

  • funkcija \(f:X \to \R\) definirana je djelovanjem na domeni \(X\) pravilom \(f(x_i) = y_i\), \(i=1,\dots,n\).

Tražimo \(\varphi (x) = ax+b\) takvu da je norma \(\|f - \varphi\|\) što manja. Za nju vrijedi

\[\| f- \varphi \|^2 = \sum_{i=1}^n (f(x_i) - \varphi(x_i))^2 = \sum_{i=1}^n (y_i - a x_i - b)^2 =: S(a,b). \]

Cilj je odrediti \(a,b \in \R\) koji minimiziraju \(S(a,b)\), uz gore definiranu funkciju \(S:\R^2 \to \R\). To možemo tehnikama diferencijalnog računa više varijabli. Nađimo stacionarnu točku tako da izjednačimo parcijalne derivacije s nulom. Koristeći da je derivacija sume jednaka sumi derivacija, dobivamo

\[\begin{split}\begin{align*} 0 = \dfrac{\partial{S(a,b)}}{\partial {a} } &= \sum_{i=1}^n -2x_i(y_i - a x_i - b) = 2a \sum_{i=1}^n x_i^2 + 2b \sum_{i=1}^n x_i - 2 \sum_{i=1}^n y_i x_i \\ 0 = \dfrac{\partial{S(a,b)}}{\partial {b} } &= \sum_{i=1}^n -2(y_i - a x_i - b) = 2a \sum_{i=1}^n x_i + 2nb - 2 \sum_{i=1}^n y_i. \end{align*}\end{split}\]

Dobili smo linearan sustav po \(a,b\). Nakon djeljenja s \(2\), matrični zapis tog sustava je

\[\begin{split}\begin{bmatrix} \sum_{i=1}^n x_i^2 & \sum_{i=1}^n x_i \\ \sum_{i=1}^n x_i & n \end{bmatrix} \begin{bmatrix} a \\ b \end{bmatrix} = \begin{bmatrix} \sum_{i=1}^n y_i x_i \\ \sum_{i=1}^n y_i \end{bmatrix}\end{split}\]

Uvrštavanjem vrijednosti iz podataka, dobivamo rješenje

\[a = 0.56, \quad b=2.14.\]

Dakle, rješenje ovog problema je pravac

\[y = 0.56 x + 2.14.\]

Da bi dokaz bio potpun, trebalo bi dokazati da je ova stacionarna točka ujedno i globalni minimum. To se može opravdati tako da se dokaže da je funkcija \(S\) konveksna gledajući njezinu drugu derivaciju, ili tako da se vidi da je graf funkcije \(S\) paraboloid, ili se možemo nasloniti na teoriju koju ćemo odraditi kasnije.

Rješenje u pythonu:

Hide code cell source
def LinearniNajmanjiKvadrati (x,y):
    # Izrada sustava jednadžbi
    n = len(x)
    A = np.zeros((2, 2))
    B = np.zeros(2)
    A [0,0] = np.sum(x[:] * x[:])
    A [1,0] = np.sum(x[:])
    A [0,1] = np.sum(x[:])
    A [1,1] = n
    B[0] = np.sum(x[:] * y[:])
    B[1] = np.sum(y[:])

    #Rješavanje sustava
    rj = np.linalg.solve(A,B)
    a = rj[0]
    b = rj[1]
    return a,b
	
# Zadani podaci
x = np.array([1, 2, 3, 4, 5])
y = np.array([2.5, 3.7, 3.5, 4.5, 4.9])

a,b = LinearniNajmanjiKvadrati(x,y)

# Ispis rezultata
print("Vrijednost a:", a)
print("Vrijednost b:", b)
Vrijednost a: 0.5599999999999993
Vrijednost b: 2.1400000000000023
Hide code cell source
# Dio koda za vizualizaciju
def model(x, a, b):
  return a * x + b
x_line = np.linspace(min(x), max(x), 100)
y_line = model(x_line, a, b)
plt.plot(x, y, 'o', label='Podaci')
plt.plot(x_line, y_line, label='Pravac')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Skup podataka i optimalni pravac')
plt.legend()
plt.grid(True)
plt.show()
_images/fcd89d5c31cfdceebb84daaaa1a6659d9fd83e76d703f6ac52c0c514936730b3.png
Primjer 4.2

Pokažimo jedan primjer u kojem \(\mathcal S\) nije vektorski prostor. Slično, kao u prošlom primjeru, nađimo najbolju aproksimacijsku funkciju \(f\) na domeni \(X = \{ x_1,\dots,x_n\}\), s vrijednostima \(f(x_i) = y_i\), gdje su podatci dani u tablici.

\(i\)

\(x_i\)

\(y_i\)

\(1\)

\(1.0\)

\(5.0\)

\(2\)

\(2.0\)

\(6.0\)

\(3\)

\(3.0\)

\(17.0\)

\(4\)

\(4.0\)

\(58.0\)

\(5\)

\(5.0\)

\(145.0\)

Razlika je u tome što tražimo aproksimaciju u formatu \(\varphi(x) = a e^{bx}\). Skup takvih funkcija, za razne \(a,b\), nije vektorski prostor. Možemo pokušati rješavati na isti način. Za normu razlike funkcija \(f\) i \(\varphi\) vrijedi

\[\| f- \varphi \|^2 = \sum_{i=1}^n (f(x_i) - \varphi(x_i))^2 = \sum_{i=1}^n (y_i - a e^{bx_i})^2 =: S(a,b). \]

Cilj je ponovno odrediti \(a,b \in \R\) koji minimiziraju \(S(a,b)\), uz gore definiranu funkciju \(S:\R^2 \to \R\), što ponovno radimo tražeći stacionarnu točku.

\[\begin{split}\begin{align*} 0 = \dfrac{\partial{S(a,b)}}{\partial {a} } &= \sum_{i=1}^n -2e^{bx_i}(y_i - a e^{bx_i})\\ 0 = \dfrac{\partial{S(a,b)}}{\partial {b} } &=\sum_{i=1}^n -2ae^{bx_i}(y_i - a e^{bx_i}). \end{align*}\end{split}\]

Došli smo do sustava nelinearnih jednadžbi po \((a,b)\). Čak i da uvedemo susptituciju za \(e^b\), parametri iz podataka \(x_i\) nalaze se u eksponentima te nepoznanice što čini problem nerješivim analitički. Sustav zato možemo riješiti samo aproksimativno nekim numeričkim alatima koje još nismo radili, dakle ne znamo eksplicitno rješenje ovog sustava. Ispostavlja se da je aproksimacija tog rješenja dana s

\[a = 1.1087915306216456, \quad b = 0.975509080405048,\]

čime smo dobili aproksimacijsku funkciju

\[\varphi (x) = 1.1087915306216456 \cdot e^{0.975509080405048 \cdot x}.\]

Ono što se u praksi često radi je da se nelinearni problemi lineariziraju. Konkretno u ovom slučaju, nećemo tražiti funkciju \(f\) takvu da je \(f\approx \varphi\), nego ćemo na obje strane primijeniti prirodni logaritam, te tražiti da je

\[\ln f (x) \approx \ln \varphi (x) = \ln a + b x.\]

Došli smo do linearnog problema najmanjih kvadrata

\[\tilde f \approx \tilde \varphi (\tilde x) = \tilde a \tilde x + \tilde b\]

uz oznake

\[\tilde{f} = \ln f, \ \tilde \varphi = \ln \varphi, \ \tilde a = b, \ \tilde b = \ln a, \ \tilde x = x, \ \tilde y_i = \ln y_i, \ \tilde x_i = x_i.\]

Dakle, uvjeti su isti kao u prvom primjeru. Nakon transformacije podataka, tablica je sada

\(i\)

\(\tilde x_i\)

\(\tilde y_i\)

\(1\)

\(1.0\)

\(1.60943791\)

\(2\)

\(2.0\)

\(1.79175947\)

\(3\)

\(3.0\)

\(2.83321334\)

\(4\)

\(4.0\)

\(4.06044301\)

\(5\)

\(5.0\)

\(4.97673374\)

Ponavljajući postupak kao u prvom primjeru, dobivamo

\[\tilde a = 0.9003275201291302, \quad \tilde b = 0.3533349353496825,\]

čime smo dobili aproksimacijsku funkciju

\[\varphi (x) = 1.4238079471926013 \cdot e^{0.9003275201291302 \cdot x},\]

drugačiju od one kada smo rješavali nelinearan problem najmanjih kvadrata.

Rješenje u pythonu:

Hide code cell source
# Zadani podaci
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 6, 17, 58, 145])

# Definiranje funkcije modela
def model(x, a, b):
  return a * np.exp(b * x)

# Pronalaženje optimalnih parametara
popt, pcov = curve_fit(model, x, y)
a = popt[0]
b = popt[1]

# Ispis rezultata
print("Vrijednost a iz nelinearnog problema:", a)
print("Vrijednost b iz nelinearnog problema:", b)

# Transformacije za linearizaciju
xt = x
yt = np.log(y)
at,bt = LinearniNajmanjiKvadrati(xt,yt)
print("Vrijednost tilda a: ", at)
print("Vrijednost tilda b: ", bt)
aL = np.exp(bt)
bL = at
print("Vrijednost a iz lineariziranog problema:", aL)
print("Vrijednost b iz lineariziranog problema:", bL)

# Dio koda za vizualizaciju
x_line = np.linspace(min(x), max(x), 100)
y_line = model(x_line, a, b)
z_line = model(x_line, aL, bL)
plt.plot(x, y, 'o', label='Podaci')
plt.plot(x_line, y_line, label='Nelinearni problem')
plt.plot(x_line, z_line, label='Linearizirani problem')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Skup podataka i optimalne krivulje')
plt.legend()
plt.grid(True)
plt.show()
Vrijednost a iz nelinearnog problema: 1.1087915286620755
Vrijednost b iz nelinearnog problema: 0.9755090807668448
Vrijednost tilda a:  0.9003275201291302
Vrijednost tilda b:  0.35333493534968247
Vrijednost a iz lineariziranog problema: 1.4238079471926013
Vrijednost b iz lineariziranog problema: 0.9003275201291302
_images/c66283c140f8a710fa5ca6c691deee13bbac4bfbb00293c01ed836d370264023.png

Treba naglasiti da linearizacijom rješavamo problem koji nije ekvivalentan nelinearnom problemu najmanjih kvadrata. Ipak, u praksi se često pokazuje da lineariziranim problemom dobivamo rješenje koje je za primjenu dovoljno dobro, metodom koja je mnogo povoljnija od nelinearnog pristupa. Zato nadalje promatramo samo linearne probleme najmanjih kvadrata.

Matrični zapis diskretnog problema najmanjih kvadrata#

Kako je \(\mathcal S\) vektorski prostor, nađimo mu bazu \(\{ \varphi_1, \dots, \varphi_m\}\). Zadatak je naći funkciju

\[\varphi(t) = \sum_{i=1}^m x_i \varphi_i(t)\]

koja najbolje aproksimira funkciju \(f : \{ t_1, \dots, t_n\} \to \R\) određenu s \(f(t_i) = y_i\).

Uvedimo matricu \(A \in \R^{n \times m}\) takvu da je \(a_{i,j} = \varphi_j(t_i)\) i vektor \(b \in \R^n\) takav da je \(b_i = y_i\), za sve \(i,j\). Tada je cilj minimizirati

\[\begin{split}\begin{align*} \| f - \varphi \|^2 &= \sum_{i=1}^n \left( f(t_i) - \varphi (t_i) \right)^2 \\ &= \sum_{i=1}^n \left( y_i- \sum_{i=1}^m x_j \varphi_j (t_i) \right)^2 \\ &= \| Ax - b \|_2^2, \end{align*}\end{split}\]

gdje je zadnja norma Euklidska norma na \(\R^n\). Dakle, početni problem zapisali smo pomoću pojmova linearne algebre: za dane \(A \in \R^{n \times m}\) i \(b \in \R^n\) potrebno je pronaći vektor \(x \in \R^m\) takav da je norma \(\| Ax - b \|_2\) najmanja moguća.

Ako je \(m\geq n\) (i ako su retci od \(A\) linearno nezavisni), tada je moguće naći \(x\) takav da je \(Ax = b\) (za \(m=n\) to je rješavanje kvadratnog sustava). Zato smo pretpostavili da je \(m<n\). Nadalje radi jednostavnosti pretpostavljamo i da je \(A\) punog stupčanog ranga \(r(A) = m\) (iako se teorija može relativno proširiti i u generalnijem smjeru).

Ovom problemu sada možemo pristupiti alatima linearne algebre i dokazati egzistenciju i jedinstvenost.

Teorem 4.3

Neka je \(m<n\), matrica \(A \in \R^{n \times m}\) ranga \(m\) i neka je dan vektor \(b \in \R^n\). Tada postoji jedinstveni \(x\in \R^m\) takav da je \(\| Ax - b \|_2\) najmanje moguće. Taj \(x\) zadovoljava

(4.1)#\[b-Ax \perp w , \quad \forall w \in \mathcal R (A).\]

te je jedinstveno rješenje sustava normalnih jednadžbi

\[A^TA x = A^T b.\]

Napomena

Ako ne pretpostavimo da je matrica \(A\) punog ranga, i dalje vrijedi egzistencija, ali nemamo jedinstvenost.

Dokaz.

Korak 1. Promotrimo bilo koji \(x \in \R^m\) sa svojstvom (4.1). U ovom koraku promatramo samo svojstva takvog vektora, za koji još ne znamo ni postoji li. Dokazat ćemo da za svaki drugi vektor \(\hat x \in \R^m\) različit od \(x\) vrijedi

\[\| b-Ax \|_2 < \| b-A\hat x\|_2,\]

čime ćemo dokazati da je \(x\) s takvim svojstvom jedinstven, te je (ako postoji) jedinstveno rješenje matričnog problema najmanjih kvadrata.

projekcija

Vektor \(A(\hat x - x)\) pripada slici \(\mathcal R(A)\), pa je prema svojstvu (4.1) vektor \(b-Ax\) okomit na njega. Kako za svaka dva okomita vektora \(u\) i \(v\) vrijedi Pitagorin identitet jer

\[\| u+ v \|^2_2 = \langle u+v, u+v \rangle = \langle u, u \rangle + \langle u, v \rangle + \langle v, u \rangle + \langle v, v \rangle = \langle u, u \rangle + \langle v, v \rangle = \| u \|^2_2 + \|v\|^2_2,\]

dobivamo

\[\| b-A\hat x \|^2_2 = \| b-Ax\|^2_2 + \| A(\hat x-x)\|^2_2 > \| b-Ax\|^2_2.\]

Nejednakost je stroga jer se jednakost može postići tek ako je \(A(\hat x - x) = 0\), što je moguće samo ako je \(\hat x = x\) jer je \(A\) punog ranga.

Korak 2. Ponovno promatramo \(x \in \R^m\) sa svojstvom (4.1) (bez dokaza postoji li). U ovom koraku dokažimo da \(x\) ima to svojstvo ako i samo ako je rješenje sustava \(A^TA x = A^T b\).

Svojstvo (4.1), odnosno da je za neki \(x\) vektor \(b-Ax\) okomit na elemente slike od \(A\), ekvivalentno je s time da za svaki \(\hat x \in \R^{m}\) vrijedi

\[0 = \langle Ax-b, A\hat x \rangle = \langle A^TAx-A^Tb, \hat x\rangle.\]

Ako vrijedi gornja jednakost za svaki \(\hat x \in \R^m\), pa tako i za \(\hat x=A^TAx-A^Tb\), odakle slijedi

\[0 = \langle A^TAx-A^Tb, A^TAx-A^Tb\rangle = \| A^TAx-A^Tb \|^2_2 \implies A^TAx-A^Tb = 0.\]

Obratno, ako je \(A^TAx-A^Tb=0\), tada jasno vrijedi \(\langle A^TAx-A^Tb, \hat x\rangle = \langle 0, \hat x \rangle = 0\) za sve \(\hat x \in \R^m\). Time smo dokazali da je svojstvo (4.1) ekvivalentno sa

\[A^TAx-A^Tb = 0,\]

odnosno s time da je \(x\) rješenje sustava \(A^TAx=A^Tb\).

Korak 3. Dokažimo da sustav normalnih jednadžbi \(A^TAx=A^Tb\) ima jedinstveno rješenje. Za to je potrebno dokazati da je matrica \(A^TA \in \R^{m \times m}\) regularna, odnosno da joj je rang jednak \(m\).

Dokazat ćemo da vrijedi \(\mathcal R(A^T A) = \mathcal R (A^T)\). To posebno znači da matrica \(A^TA\) i \(A^T\) imaju isti rang, a to je \(m\), što će dovršiti dokaz ovog koraka.

Neka je \(y \in \mathcal R (A^TA)\). Dakle, postoji \(z \in \R^m\) takav da je \(y = A^TAz\). No tada je \(y = A^T (Az)\), što dokazuje da je \(y\in \mathcal R(A^T)\).

Neka je \(y \in \mathcal R (A^T)\). Dakle, postoji \(z \in \R^n\) takav da je \(y = A^Tz\). Kako je \(\R^n = \mathcal R (A) \oplus \mathcal N (A^T)\), \(z\) možemo pisati kao \(z=Aw_1+w_2\), gdje je \(w_2 \in \mathcal N(A^T)\). Sada imamo

\[y = A^T z = A^T (Aw_1 + w_2) = A^TAw_1 + A^Tw_2 = A^TAw_1,\]

što dokazuje da je \(y\in \mathcal R (A^TA)\).

Korak 4. Zaključimo dokaz počevši s kraja. Sustav normalnih jednadžbi (prema Koraku 3) ima jedinstveno rješenje. To rješenje, prema Koraku 2, zadovoljava svojstvo (4.1), što prema Koraku 1 znači da je rješenje problema najmanjih kvadrata. Problem najmanjih kvadrata ima jedinstveno rješenje, ponovno prema Koraku 1.

Ovaj teorem daje nam teorijsku egzistenciju i jedinstvenost rješenja, te karakterizaciju tog rješenja preko sustava normalnih jednadžbi. Ipak, u praksi se rijetko koristi sustav normalnih jednadžbi budući da može svesti loše uvjetovan problem na katastrofalno uvjetovan problem. Kao primjer uzmimo \(A = \begin{bmatrix} \varepsilon & 0 \\ 0 & 1 \end{bmatrix}\). Uvjetovanost ove matrice je \(\varepsilon^{-1}\), dok je uvjetovanost matrice \(A^TA\) jednaka \(\varepsilon^{-2}\). Ako je \(\varepsilon\) malen, sustav normalnih jednadžbi može imati mnogo lošiju uvjetovanost od originalne matrice \(A\), te nepotrebno dodatno pokvariti točnost rješenja.

Primjer 4.4

Promotrimo ponovno Primjer 4.1. U tom slučaju zapravo smo imali

\[\begin{split}A = \begin{bmatrix} x_1 & 1 \\ x_2 & 1\\ \vdots & \vdots \\ x_n & 1 \end{bmatrix}, \quad b = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{bmatrix}.\end{split}\]

Sustav normalnih jednadžbi je tada dan s

\[\begin{split}A^TA = \begin{bmatrix} \sum_{i=1}^n x_i^2 & \sum_{i=1}^n x_i \\ \sum_{i=1}^n x_i & n \\ \end{bmatrix}, \quad A^Tb = \begin{bmatrix} \sum_{i=1}^n x_i y_i \\ \sum_{i=1}^n y_i \\ \end{bmatrix},\end{split}\]

što je isti sustav koji smo i rješavali da bismo odredili koeficijente \(a\) i \(b\).

S druge strane, u tom smo primjeru do sustava za \(a\) i \(b\) došli argumentima diferencijalnog računa više varijabli. To možemo i u generalnom slučaju. Promotrimo preslikavanje \(S : \R^m \to \R\),

\[S (x) = \|Ax-b\|_2^2 = \langle Ax-b, Ax-b \rangle = \langle A^TAx,x \rangle - 2 \langle A^Tb, x \rangle + \langle b,b\rangle.\]

To je preslikavanje glatko, za prve i druge derivacije vrijedi

\[\nabla S (x) = 2 A^TAx - 2 A^Tb, \quad HS (x) = 2A^TA.\]

Može se pokazati da je matrica drugih derivacija pozitivno definitna, pa je funkcija \(S\) konveksna, a njezina stacionarna točka (nultočka jednadžbe \(\nabla S (x) = 0\)) jedina točka globalnog minimuma. Uz preciznije opravdanje svih koraka, to je alternativni dokaz Teorema 4.3. Analiza može biti i kraća, funkcija \(S\) je kvadratna funkcija po \(x\), pa lokalni minimum možemo naći slično kao tjeme kvadratne funkcije u jednoj varijabli.