sábado, 6 de junio de 2015

Estadística

Análisis de la regresión

Mínimos cuadrados es una técnica de análisis numérico enmarcada dentro de la optimización matemática, en la que, dados un conjunto de pares ordenados: variable independiente, variable dependiente, y una familia de funciones, se intenta encontrar la función continua, dentro de dicha familia, que mejor se aproxime a los datos (un "mejor ajuste"), de acuerdo con el criterio demínimo error cuadrático.
En su forma más simple, intenta minimizar la suma de cuadrados de las diferencias en las ordenadas (llamadas residuos) entre los puntos generados por la función elegida y los correspondientes valores en los datos. Específicamente, se llama mínimos cuadrados promedio(LMS) cuando el número de datos medidos es 1 y se usa el método de descenso por gradientepara minimizar el residuo cuadrado. Se puede demostrar que LMS minimiza el residuo cuadrado esperado, con el mínimo de operaciones (por iteración), pero requiere un gran número de iteraciones para converger.
Desde un punto de vista estadístico, un requisito implícito para que funcione el método de mínimos cuadrados es que los errores de cada medida estén distribuidos de forma aleatoria. Elteorema de Gauss-Márkov prueba que los estimadores mínimos cuadráticos carecen de sesgo y que el muestreo de datos no tiene que ajustarse, por ejemplo, a una distribución normal. También es importante que los datos a procesar estén bien escogidos, para que permitan visibilidad en las variables que han de ser resueltas (para dar más peso a un dato en particular, véase mínimos cuadrados ponderados).
La técnica de mínimos cuadrados se usa comúnmente en el ajuste de curvas. Muchos otros problemas de optimización pueden expresarse también en forma de mínimos cuadrados, minimizando la energía o maximizando la entropía.- ................................................:http://es.wikipedia.org/w/index.php?title=Especial:Libro&bookcmd=download&collection_id=b4b2844e1b09649555589b35452c40ce37a9ffe3&writer=rdf2latex&return_to=M%C3%ADnimos+cuadrados


Método de los mínimos cuadrados. Polinomio aproximador

prev.gif (997 bytes)chapter.gif (1105 bytes)home.gif (1232 bytes)next.gif (998 bytes)

Tratamiento de datos

Polinomio aproximador
La clase PolRegesion.
El procedimiento de Seidel
java.gif (886 bytes)Ejercicios
Bibliografía

Supongamos que hemos medido un conjunto de pares de datos (xi, yi) en una experiencia, por ejemplo, la posición de un móvil en ciertos instantes de tiempo.
Queremos obtener una función y=f(x) que se ajuste lo mejor posible a los valores experimentales. Se pueden ensayar muchas funciones, rectas, polinomios, funciones potenciales o logarítmicas.
Una vez establecido la función a ajustar se determinan sus parámetros, en el caso de un polinomio, serán los coeficientes del polinomio de modo que los datos experimentales se desvíen lo menos posible de la fórmula empírica.
La función más sencilla es la función lineal y=ax+b que hemos tratado en la página anterior. El procedimiento de ajustar los datos experimentales a una línea recta se denomina regresión lineal

Polinomio aproximador

Queremos aproximar un polinomio de grado n, a un conjunto de m pares de datos (xi, yi) de modo que n£ m.
Sea el polinomio
P(x)=a0+a1x+a2x2+...anxn
Se calcula la cantidad

Para obtener los valores de los coeficientes del polinomio aproximador se tienen que determinar los valores de los coeficientes a0, a1, a2, ...an de forma que la cantidad S tome un valor mínimo.
Hagamos las derivadas parciales de S respecto de a0, a1, a2, ...an iguales a cero
              (1)
Obtenemos un sistema de n+1 ecuaciones con n+1 incógnitas, a0, a1, a2, ...an
Ejemplo:
Supongamos que tenemos 4 pares de datos y que queremos ajustarlos al polinomio de segundo grado y=a0+a1x+a2x2
xx0x1x2x3
yy0y1y2y3
Las ecuaciones (1) se escribirán

agrupando términos

Volvamos al sistema de n+1 ecuaciones con n+1 incógnitas. Introduzcamos las expresiones
             (2)
Se obtiene el siguiente sistema de n+1 ecuaciones con n+1 incógnitas
                  (3)
Si todos los puntos son distintos, el sistema de ecuaciones tiene una solución única.
Para resolver el sistema de ecuaciones se puede emplear alguno de los varios procedimientos existentes. El método empleado en este programa es el método de iteración. Ya que la matriz del sistema de ecuaciones es positiva, para este sistema se emplea el procedimiento de Seidel.

La clase PolRegesion.

La clase PolRegresion tiene los siguientes miembros dato
public class PolRegresion {
 private double[] x; //datos
 private double[] y;
 private int nDatos; 
 double[][] m; //matriz de los coeficientes
 double[] t; //términos independientes
 public double[] a; //polinomio a[0]+a[1]·x+a[2]·x2+...
 public int grado; //grado del polinomio
El constructor inicializa los miembros, array x, array y que guardan los resultados experimentales y el número nDatos de dichos datos. El constructor crea la matriz m, el vector t, y reserva espacio para el array que va a guardar los coeficientes del polinomio a, cuyo grado se guarda en el miembro grado.
public PolRegresion(double[] x, double[] y, int grado) {
 this.x=x;
 this.y=y;
 nDatos=x.length;
 this.grado=grado;
 t=new double[grado+1];
 m=new double[grado+1][grado+1];
 a=new double[grado+1];
}
A partir de datos (xi, yi) se tiene que obtener la matriz m cuadrada de los coeficientes (3) de dimensión n (grado+1) y el vector de dimensión n usando las fórmulas (2). La función miembro coeficientescalcula los elementos del vector t y de la matriz m.
private void coeficientes(){
 double[] s=new double[2*grado+1];
 double suma;
 for(int k=0; k<=2*grado; k++){
  suma=0.0;
  for(int i=0; i
  s[k]=suma;
 }
 for(int k=0; k<=grado; k++){
  suma=0.0;
  for(int i=0; i
 for(int i=0; i<=grado; i++){
  for(int j=0; j<=grado; j++){
   m[i][j]=s[i+j];
  }
 }
}
La función coeficientes llama a la función auxiliar potencia para calcular la potencia de un número elevado a un exponente entero
private double potencia(double base, int exp){
 double producto=1.0;
 for(int i=0; i

El procedimiento de Seidel

Finalmente, nos queda la tarea de resolver el sistema de n ecuaciones con n incógnitas (n es el grado del polinomio). El procedimiento empleando es el de Seidel. Explicaremos este procedimiento mediante un ejemplo. Sea el sistema lineal de tres ecuaciones

Se despeja x1 en la primera ecuación, x2 en la segunda y x3 en la tercera. Reduciéndose el sistema a una forma conveniente para aplicar el procedimiento de iteración o de aproximaciones sucesivas.
        (4)
Como podemos apreciar, las diagonales de la matriz de los coeficientes de las x son ceros.
Tomemos como aproximación inicial

La primera aproximación se escribe

Se introduce la primera aproximación de x0  en la segunda ecuación. Se introduce la primera aproximación de x0 y de x1 en la tercera ecuación, y así sucesivamente. De este modo el método de Seidel ofrece una mejor convergencia que la iteración simple.
La segunda aproximación es

En general el método se Seidel lo podemos escribir del siguiente modo.

En todo proceso iterativo, es preciso establecer la condición de finalización, no puede correr el proceso de forma indefinida. El error relativo entre dos iteraciones consecutivos k y k+1 de los valores que toman cada una de las incógnitas xi deberá ser menor que un cierto valor (por ejemplo, una milésima).

Veamos ahora el código
En primer lugar, transformamos la matriz m de los coeficientes del sistema de ecuaciones (3) y el vector t de los términos independientes, para expresarlo de la forma (4) adecuada para la iteración. Para ello, se divide los elementos de cada fila i por el elemento correspondiente de la diagonal principal m[i][i] y se cambia de signo. Los elementos de la diagonal m[i][i] se hacen cero.
for(int i=0; i<=grado; i++){
 aux=m[i][i];
 for(int j=0; j<=grado; j++){
  m[i][j]=-m[i][j]/aux;
 }
 t[i]=t[i]/aux;
 m[i][i]=0.0;
}
Se elige la aproximación inicial, y se guardan en el array p de las incógnitas
p[0]=t[0];
for(int i=1; i<=grado; i++){
 p[i]=0.0;
}
Se calcula siguiente aproximación y se guarda en el array a de las incógnitas
for(int i=0; i<=grado; i++){
 a[i]=t[i];
 for(int j=0; j
}
La iteración actual a es la iteración anterior p en el siguiente cálculo
for(int i=0; i<=grado; i++){
 p[i]=a[i];
}
El proceso se repite, hasta que se cumple la condición de finalización.Para ello, calculamos el error relativo de cada una de las incógnitas. Guardamos en la variable maximo el mayor de los errores relativos.
maximo=0.0;
for(int i=0; i<=grado; i++){
 error=Math.abs((a[i]-p[i])/a[i]);
 if (error>maximo) maximo=error;
}
Todo el procedimiento lo ponemos en el interior de un bucle do...while que se ejecuta hasta que se cumple que el valor de la variable maximo sea menor o igual que una milésima.
double error=0.0, maximo=0.0;
do{
 error=0.0;
 maximo=0.0;
 for(int i=0; i<=grado; i++){
  a[i]=t[i];
  for(int j=0; jmaximo) maximo=error;
 }
 for(int i=0; i<=grado; i++){
  p[i]=a[i];
 }
}while(maximo>0.001);
El código completo de la clase PolRegresion es el siguiente
public class PolRegresion {
  private double[] x;  //datos
  private double[] y;
  private int nDatos;
  double[][] m;    //matriz de los coeficientes
  double[] t;      //términos independientes
  public double[] a; //polinomio   a[0]+a[1]·x+a[2]·x2+...
  public int grado; //grado del polinomio

  public PolRegresion(double[] x, double[] y, int grado) {
    this.x=x;
    this.y=y;
    nDatos=x.length;
    this.grado=grado;
    t=new double[grado+1];
    m=new double[grado+1][grado+1];
    a=new double[grado+1];
  }

  private void coeficientes(){
    double[] s=new double[2*grado+1];
    double suma;
    for(int k=0; k<=2*grado; k++){
      suma=0.0;
      for(int i=0; imaximo)   maximo=error;
      }
      for(int i=0; i<=grado; i++){
          p[i]=a[i];
      }
    }while(maximo>0.001);

  }
}

Ejercicios

Determinar el polinomio aproximador de segundo grado para la siguientes tablas de datos, tomadas de una experiencia con fluidos
x0.050.10.150.20.250.30.350.4
y0.3750.6250.7500.8150.8751.001.0651.125

x0.050.10.150.20.250.30.350.4
y0.250.420.580.720.850.981.101.12

x0.050.10.150.20.250.30.350.4
y0.280.500.640.750.820.900.951.02
El siguiente applet permite introducir los datos experimentales y ajustarlos mediante un polinomio de grado menor o igual al número de datos. Los datos que aparecen cuando se inicia el applet en los controles de edición corresponden a la primera tabla.
Se elige el grado del polinomio pulsando en el botón titulado Grado polinomio>> y a continuación se pulsa en el botón titulado Calcular.
Se observa a la derecha la representación de los datos, del polinomio de ajuste y los valores de los coeficientes del polinomio.
P(x)=a0+a1x+a2x2+...anxn
Para ensayar con otros datos se pulsa el botón titulado Borrar, y a continuación se introducen los pares de datos en los controles de edición respectivos.

No hay comentarios:

Publicar un comentario