Regresion Lineal y Cuadratica
Regresion Lineal y Cuadratica
Regresion Lineal y Cuadratica
21 de marzo de 2008
ndice
1 Regresin lineal y cuadrtica 2 Regresin lineal 3 Regresin cuadrtica 4 Implementacin 5 Un caso de ejemplo 6 Resultados
Fundamentos matemticos
Este mtodo es muy utilizado. Pronostica solamente casos lineales o cuadrticos. Interpolacin Vs. Extrapolacin.
Fundamentos matemticos
Deduccin
Conocemos n datos (xi , yi ). Queremos encontrar la recta que mejor se ajusta a los n datos. Suponemos que la recta es: y = +mx donde y m son parmetros a determinar.
Fundamentos matemticos
Deduccin
Fundamentos matemticos
Deduccin
Fundamentos matemticos
Deduccin
Fundamentos matemticos
Deduccin
Fundamentos matemticos
Deduccin
Fundamentos matemticos
Deduccin
=
i=1 n
i2 (yi m xi )
i=1 2
Fundamentos matemticos
Deduccin
= =
2
i=1 n
(yi m xi ) (yi m xi ) xi
i=1
Fundamentos matemticos
Deduccin
Fundamentos matemticos
Deduccin
yi
n ( xi ) yi m xi n
Fundamentos matemticos
Deduccin
De manera semejante resolvemos el caso para encontrar la parbola de mejor ajuste. y 6 y = a x2 + b x + c 5 y = +mx 4 3 2 1 x 1 2 3 4 5 6 7
Fundamentos matemticos
Deduccin
Fundamentos matemticos
Deduccin
=
i=1 n
i2 yi a xi2 b xi c
i=1 2
Fundamentos matemticos
Deduccin
= 2
i=1 n
yi a xi2 b xi c yi a xi2 b xi c xi
i=1 n
= 2 = 2
i=1
yi a xi2 b xi c xi2
Fundamentos matemticos
Deduccin
xi3 + b xi4 + b
xi2 + c xi3 + c
Fundamentos matemticos
Deduccin
La solucin es: yi xi yi xi2 yi xi2 xi3 xi4 xi yi a xi xi2 xi3 xi xi2 xi3 ( n xi xi2 n xi xi2 xi2 n xi ) n xi
2
b c
= =
yi a
xi yi a xi2
xi3
xi2 b n
Implementacin de la simulacin
Cdigo del programa
/* Nombre del archivo: CR.cpp Este programa pide las coordenadas (x,y) de n puntos y los graba en un archivo. Despus lee estos datos y calcula a) la recta demejor ajuste, la cual se expresa como: y = beta + mx b) La parbola de mejor ajuste, que se expresa como: y = ax^2 + bx + c por el mtodo de mnimos cuadrados. ------------------------------------------------------------------Autor: Efran Soto Apolinar Email: [email protected] [email protected] Fecha de ltima Modificacin: 21 de marzo de 2008 ------------------------------------------------------------------- */
Implementacin de la simulacin
Cdigo del programa
#include <cstdio> // #include <cstdlib> // #include <iostream> // Funciones bsicas para input/output #include <conio.h> // para usar: getche, getch #include <fstream> // para grabar los datos generados... using namespace std; int main(void){ char respuesta, letra; // char file_name[15]; int i, j, n; // contadores double a, b, c; // parmetros para parbola... double m, beta; // parmetros para recta... double Da = 0, Dp = 0; double xi, yi; // datos double Sx, Sy, Sx2, Sx3, Sx4, Sxy, Sx2y; // sumas de datos... double Error_p = 0, Error_r = 0; double dip, dir, y_approxp, y_approxr;
Implementacin de la simulacin
Cdigo del programa
for(;;){ // for infinito... Sx = 0; Sy = 0; Sxy = 0; Sx2 = 0; Sx3 = 0; Sx4 = 0; Sx2y = 0; // Informacin sobre el programa... cout << "\n\nEste programa pide un grupo de datos "; cout << "\nque corresponden a las coordenadas de n"; cout << "\npuntos en el plano, guarda esta informacin"; cout << "\nen un archivo y despus lee esa informacin"; cout << "\npara encontrar la parbola de regresin"; cout << "\n\n\nPor favor, introduce las coordenadas de "; cout << "\nlos puntos conocidos, ingresando primero"; cout << "\nlacoordenada en x y despus la coordenada en y"; cout << "\nCuando hayas terminado introduce el nmero "; cout << "\n1 000 000, pero sin espacios.";
Implementacin de la simulacin
Cdigo del programa
ifstream in_stream; ofstream out_stream; // cout << "\nNombre del archivo: "; // cin >> file_name; //out_stream.open(file_name); // creo y abro el archivo... // out_stream.open("CR.txt"); // creo y abro el archivo... if (out_stream.fail()){ // si no puede abrir el archivo... cout << "\n\nNo se pudo abrir el archivo..."; cout << "\nPor favor, reinicie el programa..."; exit(1); // Termina el programa }
Implementacin de la simulacin
Cdigo del programa
for (i = 1 ; ; i++){ cout << "\nCoordenada en x del punto " << i << ": "; cin >> xi; if (xi == 1000000){ cout << "\n\n\nEl ltimo valor no se incluye..."; out_stream.close();// Cierro el archivo... cout << "\nLos datos se han grabado correctamente..."; cout << "\n\nProcesando informacin..."; n = i - 1; // Nmero total de datos... break; }
Implementacin de la simulacin
Cdigo del programa
cout << "\nCoordenada en y del punto " << i << ": "; cin >> yi; if (yi == 1000000){ cout << "\n\n\nEl ltimo valor no se incluye..."; out_stream.close();// Cierro el archivo... cout << "\nLos datos se han grabado correctamente..."; cout << "\n\nProcesando informacin..."; n = i - 1; // nmero total de datos... break; } out_stream << xi << " " << yi << " i\n"; cout << "Dato " << i << " grabado correctamente"; cout << "\n"; } // Termino de grabar la informacin...
Implementacin de la simulacin
Cdigo del programa
// Abrimos el archivo para leer... in_stream.open("CR.txt"); if (in_stream.fail()){ // si no puede abrir el archivo... cout << "\n\nNo se pudo abrir el archivo..."; cout << "\nPor favor, reinicie el programa..."; exit(1); // Termina el programa }
Implementacin de la simulacin
Cdigo del programa
for (j=1; j <= n ; j++){ // realizo clculos... in_stream >> xi >> yi; do { // estoy buscando el siguiente rengln in_stream >> letra; } while (!letra == \n); // Sx += xi; // Suma de x Sy += yi; // Suma de y Sxy += xi * yi; // Suma de xy Sx2 += xi * xi; // Suma de x cuadrada Sx3 += xi * xi * xi; // Suma de x cbica Sx4 += xi * xi * xi * xi; // Suma x cuarta Sx2y += xi * xi * yi; } // Cierro el archivo de lectura... in_stream.close();
Implementacin de la simulacin
Cdigo del programa
// Calculo parmetros de recta... m = (n * Sxy - Sx * Sy) / (n * Sx2 - Sx * Sx); beta = (Sy - m * Sx) / n; // Calculo los parmetros de parbola... Da = Sy * Sx2 * Sx2 + n * Sxy * Sx3 + Sx * Sx * Da = Da - n * Sx2 * Sx2y - Sx * Sx3 * Sy - Sx * Dp = Sx2 * Sx2 * Sx2 + n * Sx3 * Sx3 + Sx4 * Sx Dp = Dp - n * Sx2 * Sx4 - 2 * Sx * Sx2 * Sx3; a = Da / Dp; b = (Sx * (Sy - a * Sx2) - n * (Sxy - a * Sx3)) (Sx * Sx - n * Sx2); c = (Sy - a * Sx2 - b * Sx) / n;
Implementacin de la simulacin
Cdigo del programa
// Muestro los resultados... cout << "\n\n\n"; // espacio cout << "La recta de mejor ajuste es: \n"; cout << "\n y = " << beta << " + " << m << " x "; cout << "\n\n\n"; // espacio cout << "La parbola de mejor ajuste es: \n"; cout << "\n y = " << a << " x^2 + " << b << " x + " << c; cout << "\n\n\n";
Implementacin de la simulacin
Cdigo del programa
// Vuelvo a abrir el archivo donde estn grabados los datos... in_stream.open("CR.txt"); if (in_stream.fail()){ // si no puede abrir el archivo... cout << "\n\nNo se pudo abrir el archivo..."; cout << "\nPor favor, reinicie el programa..."; exit(1); // Termina el programa }
Implementacin de la simulacin
Cdigo del programa
for (j=1; j <= n ; j++){ // realizo clculos... in_stream >> xi >> yi; do { // estoy buscando el siguiente rengln in_stream >> letra; } while (!letra == \n); // // clculo con la parbola de regresin... y_approxp = a * xi * xi + b * xi + c; y_approxr = beta + m * xi; // discrepancia... dip = (yi - y_approxp) * (yi - y_approxp); dir = (yi - y_approxr) * (yi - y_approxr); Error_p += dip; // Error total Error_r += dir; }
Implementacin de la simulacin
Cdigo del programa
// Cierro el archivo de lectura... in_stream.close(); cout << "\n\n\n"; // espacio cout << "\nError total para la recta: " << Error_r; cout << "\nError total para la parbola: " << Error_p; cout << "\n\n\n"; // espacio cout << "Generando datos de la parbola de mejor ajuste..."; // creo y abro el archivo... // pma = parbola de mejor ajuste. out_stream.open("pma.txt"); if (out_stream.fail()){ // si no puede abrir el archivo... cout << "\n\nNo se pudo abrir el archivo..."; cout << "\nPor favor, reinicie el programa..."; exit(1); // Termina el programa }
Implementacin de la simulacin
Cdigo del programa
// Reinicio las coordenadas... xi = 0; yi = 0; for (i = 0 ; i <= 100 ; i++){ yi = a * xi * xi + b * xi + c; // grabamos los datos en el archivo... out_stream << xi << " " << yi << " i\n"; xi = xi + 0.07; } cout << "\n\n\nSe han grabado 100 datos en el intervalo"; cout << "\n(0,7) en el archivo <<pma.txt>>"; out_stream.close();// Cierro el archivo...
Implementacin de la simulacin
Cdigo del programa
// pregunto si desea salir... cout << "\n\n\nPresione < S > para salir..."; respuesta = getche(); if ((respuesta == S)||(respuesta == s)){ break; // Salir del ciclo for inicial... } cout << "\n\n\n"; } // end for infinito... return 0; }
Ejemplo
Un caso de ejemplo
Consideramos los siguientes datos: x 1 2 3 4 5 6 7 y 0.5 2.5 2.0 4.0 3.5 6.0 5.5
Ejemplo
Grca de datos
y 6 5 4 3 2 1 x 1 2 3 4 5 6 7
Ejemplo
Resultados
El programa arroja los siguientes resultados: Recta de mejor ajuste: y = 0.0714286 + 0.839286 x. Parbola de mejor ajuste: y = 0.0297619 x 2 + 1.07738 x 0.285714 Error total para la recta: 2.99107 Error total para la parbola: 2.91667
Resultados
Recta de regresin
y 6 5 y = 0.0714286 + 0.839286 x 4 3 2 1 x 1 2 3 4 5 6 7
Resultados
Parbola de regresin
Desventajas
Desventajas del mtodo
Se requiere ms informacin. Cada parmetro tiene asociado un error. El mtodo de regresin aproxima bien en interpolacin NO en extrapolacin. El proceso no es estocstico, sino determinista. No se conoce la distribucin de las discrepancias.
Ventajas
Ventajas del mtodo
Parmetros con errores pequeos. Mientras mayor informacin se tenga, los parmetros tienen menos errores. Puede servir para aproximar datos faltantes.
Gracias
Fin de la presentacin