PHP: calcolare la retta di regressione lineare con i minimi quadrati
Il metodo dei minimi quadrati si basa sul principio per il quale la migliore curva interpolante di un dato insieme di punti è la curva che ha la proprietà di avere minima la somma degli scarti quadratici, ovvero le differenze elevate al quadrato delle singole distanze fra i punti dati e i punti corrispondenti della retta interpolante.
Il procedimento per determinare i punti della nostra retta viene calcolato risolvendo:
sapendo che il termine noto si ricava da:
sostituendo q e sviluppando il quadrato si ottiene:
... a vederla così sembra bruttina, ma con le opportune sostituzioni rispetto a m:
otteniamo:
... adesso è più leggibile, è una equazione di una parabola. Trovare il valore minimo equivale a trovare il vertice. Qui bisognerebbe recuperare qualche reminiscenza sul calcolo delle derivate, comunque la soluzione è:
m, guarda caso... è anche il coefficiente angolare della nostra retta: quello che ci mancava!
Ora abbiamo in mano tutti i dati per costruire l'algoritmo.
Ecco quindi il codice della funzione, sviluppato in linguaggio PHP:
function regressione($X,$Y) { if (!is_array($X) && !is_array($Y)) return false; if (count($X) <> count($Y)) return false; if (empty($X) || empty($Y)) return false; $regres = array(); $n = count($X); $mx = array_sum($X)/$n; // media delle x $my = array_sum($Y)/$n; // media delle y $sxy = 0; $sxsqr = 0; for ($i=0;$i<$n;$i++){ $sxy += ($X[$i] - $mx) * ($Y[$i] - $my); $sxsqr += pow(($X[$i] - $mx),2); // somma degli scarti quadratici medi } $m = $sxy / $sxsqr; // coefficiente angolare $q = $my - $m * $mx; // termine noto for ($i=0;$i<$n;$i++){ $regres[$i] = $m * $X[$i] + $q; } return $regres; }La funzione restituisce l'array delle ordinate della retta di regressione. I dati campione si riferiscono al solito rapporto peso / altezza di alcune persone. Per una più chiara rappresentazione dei dati, è necessario realizzare un grafico con il modello "dispersione" per i dati campionari e il modello "retta" per i dati della regressione.
Ho utilizzato il plugin di JQuery: Flot, facendo generare server-side lo script necessario alla rappresentazione del grafico. L'esempio di applicazione di questa funzione e del grafico correlato è visibile in questa demo.
Per completezza occorre dire che bisognerebbe calcolare anche il coefficiente R2 che fornisce indicazioni sulla qualità della correlazione rispetto ai dati. Il coefficiente varia tra 0 e 1 e, tanto più si avvicina a 1, tanto più i dati sono ben correlati.
Conclusioni:
Un breve ripasso di statistica e matematica delle superiori si è reso necessario per sviluppare un algoritmo molto usato, ma non sempre con cognizione di causa!
Riferimenti ed approfondimenti:
Nessun commento:
Posta un commento