Regresión Lineal
El ejemplo más simple de una aproximación por
mínimos cuadrados es mediante el ajuste de un conjunto de pares de
observaciones: (x1, y1), (x2, y2),
(x3, y3),..., (xn, yn )
a una línea recta. La expresión matemática de la línea recta es:
y = a0 + a1x + e
donde a0 y a1, son los coeficientes que
representan el cruce con el eje y y la pendiente de la línea y e
representa el error de nuestra aproximación.
Una estrategia, para ajustar a la mejor línea,
es minimizar la suma al cuadrado de los errores para todos los datos
disponibles
Esta misma ecuación la podemos escribir en
forma matricial como
El vector de error en forma matricial queda
como
y en general
En forma compacta tenemos que e = y – Ma,
donde M es la matriz de coordenadas en x y a el vector de
parámetros.
Ajuste por mínimos cuadrados
Si queremos encontrar el vector de parámetros a
que minimiza nuestra suma de cuadrados, tenemos que calcular la derivada de la
función de error respecto al vector de parámetros e igualar a cero.
El valor del vector de parámetros a los
calculamos resolviendo el siguiente sistema de ecuaciones
Es común encontrar la solución de este sistema
como:
Hacer el ajuste a una línea recta de los
siguientes valores
x |
y |
1.00 |
0.50 |
2.00 |
2.50 |
3.00 |
2.00 |
4.00 |
4.00 |
5.00 |
3.50 |
6.00 |
6.00 |
7.00 |
5.50 |
Aplicando las formulas anteriores, tenemos que
el sistema de ecuaciones a resolver es
7 |
28.00 |
|
a0 |
|
24.00 |
28 |
784.00 |
|
a1 |
|
119.50 |
La solución es a = [0.07142, 0.8392] y en la
siguiente figura se muestra el ajuste encontrado
Podemos generalizar el caso de la regresión lineal y extenderla a cualquier polinomio de orden m.
[MTM]a = MTy
Así por ejemplo la solución para un polinomio de orden 3 es:
Note que cada uno de los elementos de la matriz
MTM son una sumatoria de todos los valores de x elevado a un
exponente que resulta ser la suma del renglón y la columna donde se localiza.
Adicionalmente la matriz es simétrica.
El vector de términos independientes es
Ajustar a un polinomio de segundo orden los
datos en la siguiente tabla.
x |
y |
0.00 |
2.10 |
1.00 |
7.70 |
2.00 |
13.60 |
3.00 |
27.20 |
4.00 |
40.90 |
5.00 |
61.10 |
El sistema de ecuaciones que debemos resolver
es:
6.00 |
15.00 |
55.00 |
|
a[0] |
|
152.60 |
15.00 |
55.00 |
225.00 |
|
a[1] |
= |
585.60 |
55.00 |
225.00 |
979.00 |
|
a[2] |
|
2488.80 |
El ajuste da como resultado el polinomio p(x)
= 2.4785 + 2.3592x + 1.8607x2.
En la siguiente figura se muestra la aproximación a un polinomio de segundo
orden.
public class ej034 {
public static void main(String[] args) {
double x[]
= {0, 1, 2, 3, 4,
5};
double y[]
= {2.1, 7.7, 13.6, 27.2, 40.9, 61.1};
double a[]
= Regresion(x, y, 2);
for(int
i=0; i<a.length; i++)
System.out.println("a["+i+"] = "+ a[i]);
grafica(x, y, a);
}
public static
double [] Regresion(double x[], double y[], int orden)
{
int i, j, n
= orden +1;
double
a[] = new double[n];
double
MM[][] = new double [n][n];
double
My[] = new double[n];
for(i=0;
i<n; i++)
{
for (j =
0; j <= i; j++) {
MM[i][j] = sumas(x, i + j);
MM[j][i] = MM[i][j];
}
My[i] =
sumas(x, y, i);
}
imprime(MM,
My);
slineal.Solucion(MM, a, My);
return a;
}
static public
void grafica(double x[], double y[], double a[])
{
int i, j, n
= x.length, m = a.length;
double yc[]
= new double[n];
for(i=0;
i<n; i++)
{
yc[i] =0;
for(j=0;
j<m; j++)
yc[i]
+= a[j] * eleva(x[i], j);
}
grafica g =
new grafica("salida");
g.Datos(x,
y);
g.Datos(x,
yc);
g.show();
}
static public
void imprime(double A[][], double b[])
{
int n =
b.length;
int i, j;
for(i=0;
i<n; i++)
{
for (j =
0; j < n; j++)
System.out.print(A[i][j]
+ "\t");
System.out.println("\t" + "a["+i+"] \t" +
b[i]);
}
}
public static
double sumas(double x[], int exp)
{
double suma
= 0;
int n =
x.length;
for(int
k=0; k<n; k++)
suma += eleva(x[k], exp);
return suma;
}
public static
double sumas(double x[], double y[], int exp)
{
double suma
= 0;
int n =
x.length;
for(int
k=0; k<n; k++)
suma += eleva(x[k], exp)*y[k];
return suma;
}
public static
double eleva(double x, int exp)
{
double
resul = 1;
for(int
i=1; i<=exp; i++)
resul *=
x;
return
resul;
}
}