Queste note sono basate sugli appunti fatti con Gianmarco Manzini negli anni 1995-2005

Metodo QR per sistemi lineari

Appunti di calcolo numerico

Autore/Autrice
Affiliazione

Enrico Bertolazzi

University of Trento, Department of Industrial Engineering

Problema dei minimi quadrati

Consideriamo il seguente sistema lineare

\left\{ \begin{aligned} x &= 0 \\ x &= 1 \end{aligned} \right.

È evidente che questo sistema non ha soluzione. Supponiamo ora che x rappresenti una quantità ottenuta tramite misurazioni soggette a errore, e che x = 0 e x = 1 siano i valori di due misure. Possiamo quindi riformulare il problema come

\left\{ \begin{aligned} x &= 0+\epsilon_1 \\ x &= 1+\epsilon_2 \end{aligned} \right.

dove \epsilon_1 ed \epsilon_2 rappresentano gli errori di misura. Poiché tali errori non sono noti, possiamo distribuire l’errore tra le due misure, ottenendo

x=\frac{1}{2}\quad\implies\quad \epsilon_1 = \frac{1}{2}, \quad \epsilon_1=-\frac{1}{2}

se però abbiamo tre misure

\left\{ \begin{aligned} x &= 0+\epsilon_1 \\ x &= 1+\epsilon_2 \\ x &= 1+\epsilon_3 \end{aligned} \qquad \color{red} \right\} \quad \textrm{\color{blue}come distribuisco gli errori?}

alcune possibilità

  • minimizzo |\epsilon_1|+|\epsilon_2|+|\epsilon_3|, ma la funzione valore assoluto non è differenziabile sullo 0.

  • minimizzo \epsilon_1^2+\epsilon_2^2+\epsilon_3^2, questa funzione è differenziabile.

  • posso migliorare se minimizzo w_1\epsilon_1^2+w_2\epsilon_2^2+w_3\epsilon_3^2, dove w_k sono dei pesi positivi che stanno a indicare la affidabilità della misuira. Se w_k è grande la misura è affidabile se w_k è piccolo lo è meno.

Consideriamo quindi la funzione

f(\epsilon_1,\epsilon_2,\epsilon_3)= \epsilon_1^2 + \epsilon_2^2 + \epsilon_3^2

dove

\left\{ \begin{aligned} \epsilon_1 & = x \\ \epsilon_2 & = x-1\\ \epsilon_3 & = x-1 \end{aligned} \right.

e quindi

f(\epsilon_1,\epsilon_2,\epsilon_3)= \epsilon_1^2 + \epsilon_2^2 + \epsilon_3^2 = x^2 + (x-1)^2 + (x-1)^2 = g(x)

cercando il minimo

g'(x) = 2x+4(x-1) = 6x-4 = 0,\quad\implies\quad x = \dfrac{2}{3}

Generalizzando a n misure: \left\{ \begin{aligned} x &= y_1+\epsilon_1 \\ x &= y_2+\epsilon_2 \\ x &= y_3+\epsilon_3 \\ &\vdots \\ x &= y_n+\epsilon_n \end{aligned} \right.

per cui

f(\bm{\epsilon}) = \sum_{k=1}^n \epsilon_k^2 = \sum_{k=1}^n (x-y_k)^2 = g(x)

e cercando il minimo

g'(x) = 2\sum_{k=1}^n (x-y_k) = 0, \quad\implies\quad x = \dfrac{1}{n}\sum_{k=1}^n y_k

che è la media delle misure. Soluzione molto intuitiva.

Questo approccio si può generalizzare e prende il nome di metodo dei minimi quadrati.

Regressione lineare

Consideriamo una serie di punti (x_k,y_k) e supponiamo di sapere che questi punti si discribuiscono su una retta

R(x) = A + Bx

ovvero y_k = R(x_k) con A e B da determinare. Questa si chiama retta di regressione lineare. Nel caso di dati perfetti basterebbero due punti ma i dati sono affetti da errore e quindi

\left\{ \begin{aligned} A + B x_0 &= y_0 + \epsilon_0 \\ A + B x_1 &= y_1 + \epsilon_1 \\ A + B x_2 &= y_2 + \epsilon_2 \\ &\vdots \\ A + B x_n &= y_n + \epsilon_n \end{aligned} \right.

per cui la somma dei quadrati degli errori diventa

\sum_{k=0}^n \epsilon_k^2 = \sum_{k=0}^n (A + B x_k - y_k)^2 = f(A,B)

i punti di minimo soddisfano \nabla f(A,B)=0 ovvero

\begin{aligned} \dfrac{\partial f(A,B)}{\partial A} &= 2\sum_{k=0}^n (A + B x_k - y_k) \\ & = 2(n+1)A + 2\left(\sum_{k=0}^n x_k\right) B - 2\sum_{k=0}^n y_k = 0 \\ \dfrac{\partial f(A,B)}{\partial B} &= 2\sum_{k=0}^n (A + B x_k - y_k)x_k \\ & = 2\left(\sum_{k=0}^n x_k\right) A+ 2\left(\sum_{k=0}^n x_k^2\right) B - 2\sum_{k=0}^n x_ky_k = 0 \end{aligned}

e quindi otteniamo il sistema lineare

\begin{pmatrix} n+1 & \displaystyle\sum_{k=0}^n x_k \\ \displaystyle\sum_{k=0}^n x_k & \displaystyle\sum_{k=0}^n x_k^2 \end{pmatrix} \begin{pmatrix} A \\[2em] B \end{pmatrix} = \begin{pmatrix} \displaystyle\sum_{k=0}^n y_k \\ \displaystyle\sum_{k=0}^n x_k y_k \end{pmatrix}

la cui soluzione produce la retta di regressione lineare cercata.

Usando la libreria di R per fare il fitting otteniamo

# Generazione di dati sintetici
set.seed(123)  # Per riproducibilità
x <- seq(1, 10, by = 0.5)  # Variabile indipendente
y <- 2.5 * x + rnorm(length(x), mean = 0, sd = 3)  # Variabile dipendente con rumore

# Fitting lineare
fit <- lm(y ~ x)

# Sommario del modello
summary(fit)

Call:
lm(formula = y ~ x)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.2312 -1.9646 -0.0946  1.4675  4.9818 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   0.7839     1.5685   0.500    0.624    
x             2.4524     0.2553   9.606 2.78e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.047 on 17 degrees of freedom
Multiple R-squared:  0.8444,    Adjusted R-squared:  0.8353 
F-statistic: 92.28 on 1 and 17 DF,  p-value: 2.781e-08

e poi plottiamo la soluzione

# Plot dei dati e della retta di regressione
plot(x, y, main = "Regressione lineare",
     xlab = "X", ylab = "Y", pch = 16, col = "blue")
abline(fit, col = "red", lwd = 2)
# Aggiunge la retta di regressione

# Aggiunta della legenda
legend("topleft", legend = c("Dati osservati", "Fit lineare"),
       col = c("blue", "red"), pch = c(16, NA), lwd = c(NA, 2), bty = "n")

cat("Coefficiente angolare (B):", coef(fit)[2], "\n")
Coefficiente angolare (B): 2.452363 
cat("Intercetta (A):", coef(fit)[1], "\n")
Intercetta (A): 0.7838889 

Fitting polinomiale

Consideriamo una serie di punti (x_k,y_k) e supponiamo di sapere che questi punti si discribuiscono su una parabola

R(x) = A + Bx + C x^2

ovvero y_k = R(x_k) con A, B e C da determinare. Nel caso di dati perfetti basterebbero tre punti ma i dati sono affetti da errore e quindi

\left\{ \begin{aligned} A + B x_0 + C x_0^2 &= y_0 + \epsilon_0 \\ A + B x_1 + C x_1^2 &= y_1 + \epsilon_1 \\ A + B x_2 + C x_2^2 &= y_2 + \epsilon_2 \\ &\vdots \\ A + B x_n + C x_n^2 &= y_n + \epsilon_n \end{aligned} \right.

per cui la somma dei quadrati degli errori diventa

\dfrac{1}{2}\sum_{k=0}^n \epsilon_k^2 = \dfrac{1}{2}\sum_{k=0}^n (A + B x_k + C x_k^2 - y_k)^2 = f(A,B,C)

i punti di minimo soddisfano \nabla f(A,B)=0 ovvero

\begin{aligned} \dfrac{\partial f(A,B,C)}{\partial A} &= \sum (A + B x_k + C x_k^2 - y_k) \\ & = (n+1)A + \left(\sum x_k\right) B + \left(\sum x_k^2\right) C - \sum y_k = 0 \\ \dfrac{\partial f(A,B,C)}{\partial B} &= \sum (A + B x_k + C x_k^ 2- y_k)x_k \\ & = \left(\sum x_k\right) A+ \left(\sum x_k^2\right) B + \left(\sum x_k^3\right) C - \sum x_ky_k = 0 \\ \dfrac{\partial f(A,B,C)}{\partial C} &= \sum (A + B x_k + C x_k^ 2- y_k)x_k \\ & = \left(\sum x_k^2\right) A+ \left(\sum x_k^3\right) B + \left(\sum x_k^4\right) C - \sum x_k^2y_k = 0 \end{aligned}

e quindi otteniamo il sistema lineare

\begin{pmatrix} n+1 & \sum x_k & \sum x_k^2 \\[1em] \sum x_k & \sum x_k^2 & \sum x_k^3 \\[1em] \sum x_k^2 & \sum x_k^3 & \sum x_k^4 \end{pmatrix} \begin{pmatrix} A \\[1em] B \\[1em] C \end{pmatrix} = \begin{pmatrix} \sum y_k \\[1em] \sum x_k y_k \\[1em] \sum x_k^2 y_k \end{pmatrix}

la cui soluzione produce la parabola di regressione cercata.

Forma matriciale del problema

In forma matricale il problema dei minimi quadrati diventa

\bm{A}\bm{x} = \bm{b} + \bm{\epsilon}

per cui il problema diventa minimizzare la norma euclidea di \bm{\epsilon} ovvero

\textrm{minimize:}\qquad \sqrt{\bm{\epsilon}\cdot\bm{\epsilon}} = \|\bm{\epsilon}\|_2 = \|\bm{A}\bm{x} - \bm{b}\|_2

dove

\bm{A}= \begin{pmatrix} A_{00} & A_{01} & \cdots & A_{0m} \\ A_{10} & A_{11} & \cdots & A_{1m} \\ A_{20} & A_{21} & \cdots & A_{2m} \\ A_{30} & A_{31} & \cdots & A_{3m} \\ \vdots & \vdots & & \vdots \\ A_{n0} & A_{11} & \cdots & A_{nm} \\ \end{pmatrix}

e \bm{\epsilon} = \begin{pmatrix} \epsilon_0 \\ \epsilon_1 \\ \epsilon_2 \\ \epsilon_3 \\ \vdots \\ \epsilon_n \end{pmatrix} \quad \bm{x}= \begin{pmatrix} x_0 \\ x_1 \\ \vdots \\ x_m \end{pmatrix} \quad \bm{b}= \begin{pmatrix} b_0 \\ b_1 \\ b_2 \\ b_3 \\ \vdots \\ b_n \end{pmatrix}

Codice
n_rows <- 5  # Numero di righe (equazioni)
n_cols <- 3  # Numero di colonne (incognite)

# Imposta la finestra grafica
plot(1, type = "n", xlim = c(0, 10), ylim = c(0, n_rows),
     xaxt = 'n', yaxt = 'n', xlab = "", ylab = "",
     main = expression(bold(A) %*% bold(x) == bold(b)+bold(e)), asp = 1, bty = "n")

# Disegna un singolo rettangolo per l'intera matrice A
rect(0, 0, n_cols, n_rows, col = "skyblue", border = "black")
text(n_cols / 2, n_rows / 2, "A", cex = 2)

# Disegna un singolo rettangolo per il vettore x (incognite)
rect(n_cols + 0.5, n_rows-n_cols, n_cols + 1.5, n_rows, col = "lightgreen", border = "black")
text(n_cols + 1, n_rows-n_cols + n_cols / 2, "x", cex = 2)

# Disegna il segno "="
text(n_cols + 2.2, n_rows / 2, "=", cex = 2)

# Disegna un singolo rettangolo per il vettore b (risultato)
rect(n_cols + 3, 0, n_cols + 4, n_rows, col = "lightcoral", border = "black")
text(n_cols + 3.5, n_rows / 2, "b", cex = 2)

# Disegna il segno "="
text(n_cols + 4.5, n_rows / 2, "+", cex = 2)

# Disegna un singolo rettangolo per il vettore epsilon (errore)
rect(n_cols + 5, 0, n_cols + 6, n_rows, col = "yellow", border = "black")
text(n_cols + 5.5, n_rows / 2, "e", cex = 2)

Figura 1: Schema del problema ai minimi quadrati

quindi minimizzare \|\bm{\epsilon}\|_2 è equivalente a minimizzare \|\bm{A}\bm{x}-\bm{b}\|_2.

Anticipiamo alcuni risultati che verranno discussi negli appunti sulla costruzione della fattorizzazione QR:

  • Una matrice \bm{Q} è ortgonale se la sua inversa coincide con la trasposta, ovvero \bm{Q}^{-1} = \bm{A}^\top

  • Le matrici orgonali applicate ad un vettore non ne cambiano la lunghezza ovvero

    \|\bm{Q}\bm{v}\|_2 = \|\bm{v}\|_2

  • Data una matrice \bm{A} quadrata o rettangolare con piu righe che colonne di rango massimo allora si può decomporre come

    \bm{A} = \bm{Q}\begin{pmatrix} \bm{R} \\ \bm{0} \end{pmatrix}

    dove \bm{Q} è una matrice ortogonale e \bm{R} è una matrice (quadrata) triangolare superiore.

Torniamo ora al problema di minimizzare \|\bm{A}\bm{x}-\bm{b}\|. Usando la decomposizione QR possiamo scrivere

\begin{aligned} \|\bm{A}\bm{x}-\bm{b}\|_2 & = \left\|\bm{Q}\begin{pmatrix} \bm{R} \\ \bm{0} \end{pmatrix}\bm{x}-\bm{b}\right\|_2 \\ & = \left\|\bm{Q}\left[\begin{pmatrix} \bm{R} \\ \bm{0} \end{pmatrix}\bm{x}-\bm{Q}^\top\bm{b}\right]\right\|_2 \\ & = \left\|\begin{pmatrix} \bm{R} \\ \bm{0} \end{pmatrix}\bm{x}-\bm{Q}^\top\bm{b}\right\|_2 \end{aligned}

partizionando il vettore \bm{Q}^\top\bm{b}

\begin{aligned} \|\bm{A}\bm{x}-\bm{b}\|_2 & = \left\|\begin{pmatrix} \bm{R} \\ \bm{0} \end{pmatrix}\bm{x}- \begin{pmatrix} \bm{Q}_1^\top \\ \bm{Q}_2^\top \end{pmatrix}\bm{b}\right\|_2 \\ & = \left\| \begin{pmatrix} \bm{R}\bm{x}-\bm{Q}_1^\top\bm{b} \\ \bm{Q}_2^\top\bm{b} \end{pmatrix} \right\|_2 \end{aligned}

usando la definizione di \|\cdot\|_2 è facile verificare che per vettori partizionati vale

\left\| \begin{matrix} \bm{x} \\ \bm{y} \end{matrix} \right\|_2^2 = \left\| \bm{x} \right\|_2^2 + \left\| \bm{y} \right\|_2^2

per cui possiamo scrivere

\|\bm{A}\bm{x}-\bm{b}\|_2^2 = \left\| \begin{pmatrix} \bm{R}\bm{x}-\bm{Q}_1^\top\bm{b} \\ \bm{Q}_2^\top\bm{b} \end{pmatrix} \right\|_2^2 = \underbrace{ \left\| \bm{R}\bm{x}-\bm{Q}_1^\top\bm{b} \right\|_2^2 }_{\textrm{può essere messo a $0$}} + \underbrace{ \left\| \bm{Q}_2^\top\bm{b} \right\|_2^2 }_{\textrm{non si pùo modificare}}

è chiaro quindi che il minimo si ottiene quando \bm{R}\bm{x}-\bm{Q}_1^\top\bm{b}=\bm{0}

Con la decomposizione QR quindi il problema dei minimi quadrati si risolve facilmente:

  • Dato \bm{A}\bm{x}=\bm{b}+\bm{\epsilon} il minimo dell’errore (in norma euclidea) si ottine con i seguenti passaggi:

    • Calcolo decomposizione QR di \bm{A} ovvero

      \bm{A} = \bm{Q}\begin{pmatrix}\bm{R}\\\bm{0}\end{pmatrix}

    • Moltiplico \bm{Q}^\top per \bm{b} e partiziono il risultato in due parti, la prima di lunghezza il numero delle colonne di \bm{A}:

      \bm{Q}^\top\bm{b} = \begin{pmatrix} \bm{Q}_1^\top \bm{b} \\ \bm{Q}_2^\top \bm{b} \end{pmatrix}

    • La norma \|\bm{Q}_2^\top \bm{b}\|_2^2 è il valore minimo della minimizzazione

    • La soluzione del sistema lineare ridotto

      \bm{R}\bm{x} = \bm{Q}_1^\top \bm{b}

      è la soluzione cercata.