Regresión Lineal

--Originally published at conzmr.wordpress.com

Antecedentes

El análisis de regresión es una técnica de modelado predictivo que investiga la
relación entre una variable dependiente y una variable independiente.
Es una herramienta importante en modelado y análisis de datos. Tratamos de
ajustar una curva o línea a la nube de datos de tal manera que las diferencias
entre las distancias de la nube de datos a la curva o línea sea mínima.
La regresión lineal es un modelo matemático usado para aproximar la relación de
dependencia entre una variable dependiente y variables independientes.
Hay innumerables formas de regresión, cada una tiene sus condiciones y
situaciones especificas donde aplican mejor que otras.

Justificación y propósito

Como mencioné anteriormente, el análisis de regresión estima la relación entre
dos o más variables. Los beneficios de usar regresión son:

  • Indica la relación significativa entre variable dependiente e independiente.
  • Indica la fuerza de impacto de multiples variables independientes en una
    variable dependiente.

Fundamento matemático con gráficos

La regresión lineal se representa con una ecuación de la forma Y = a + b*X + e,
donde a es la intercepción, b es la pendiente de la linea y e es un termino de error.
Esta ecuación se puede utilizar para predecir el valor de la variable dependiente
basado en la(s) variable(s) predictoras.

Para obtener la linea que mejor se ajusta a los datos (es decir, obtener a y b),
podemos usar el método de los mínimos cuadrados. Es el método más común usado
para ajustar una linea de regresión. Este calcula la linea a partir de los datos
observados minimizando la suma de los cuadrados de las desviaciones verticales
desde cada punto a la linea, debido a que las desviaciones están elevadas al
cuadrado, no se cancelan valores positivos y negativos cuando son sumadas.

reg_error

Podemos aplicar regresión lineal a cualquier nube

dfex.png
niños
produccion
ventas
Continue reading "Regresión Lineal"

Linealización de modelos no lineales

--Originally published at conzmr.wordpress.com

Algunas veces la regresión lineal puede ser usada en relaciones que no son
inherentemente lineales, después de aplicar una transformación.

Regresión exponencial

Consideramos el siguiente modelo exponencial: y = aexp(b x).

Aplicando el logaritmo natural a ambos lados de la ecuación tenemos la siguiente
ecuación equivalente: ln(y) = ln(a) + b * x.

Esta ecuación tiene la forma de un modelo de regresión lineal: y’ = a’ + b * x

Regresión potencial

Otro modelo de regresión no lineal es el modelo de regresión potencial, que se basa en la siguiente ecuación: y = a * x ^ b

Aplicando logaritmo a ambos lados de la ecuación, tenemos:
log(y) = log(a) + b * log(x)

Esta ecuación tiene la forma de un modelo de regresión lineal: y’ = a’ + b * x’

Ejemplos

Con estos datos podemos apreciar en la gráfica de abajo que el modelo exponencial
(en rojo) se ajusta mucho mejor a los datos que el modelo lineal (en negro).
Cabe destacar que las regresiones están siendo afectadas por el Outlier que está
en (3, 625).

X Y
0 400
1 100
2 25
3 625
4 1.5625

Equation: Y_guess = exp(5.991465) * exp(-0.925777 * X)

Standard error: 348.836

Determination coefficient: -0.233174

Correlation coefficient: 0.482881

ej1_linear_vs_exp.png

En este segundo caso el modelo que mejor se acerca es también el exponencial,
ajustandose casi perfectamente a los datos.

X Y
1996 5000
1997 5400
1998 5800
1999 6300
2000 6800
2001 7300
2002 7900
2003 8600
2004 9300
2005 10000
2006 11000

Equation: Y_guess = exp(-147.463576) exp(0.078144 X)

Standard error: 54.522

Determination coefficient: 0.999313

Correlation coefficient: 0.999656

ej2_exp.png

En este tercer ejemplo el modelo exponencial se ajusta bien a los datos, a pesar
de que estos esten más dispersos.

ej3_exp.png
ej4_exp.png
ej5_all.png
Continue reading "Linealización de modelos no lineales"

Método de la Secante

--Originally published at conzmr.wordpress.com

Método Secante

El método de la secante es un algoritmo para encontrar la raíz de una función que se asume que es aproximadamente lineal en la región de interés. Cada aproximación se toma como el punto donde la linea secante corta el eje x.

secantmethod

Método secante

En qué consiste

Se basa en obtener la ecuación de la recta que pasa por los puntos (x_i-1, f(x_m.1)) y (x_i, f(x_i)). A dicha recta se le llama secante por cortar la gráfica de la función. Posteriormente se escoge como siguiente elemento de la relación de recurrencia x_i+1, la intersección de la recta secante con el eje de las abscisas obteniendo la fórumula y un nuevo valor. A continuación continuamos con este proceso, hasta llegar a un nivel de precisión suficientemente alto (una diferencia suficientemente pequeña entre x_n y x_n-1).

Se basa en la fórmula de Newton-Raphson, pero evita el cálculo de la derivada usando la siguiente aproximación:

f'(x) ≈ (f(x_i-1) – f(x_i)) / (x_i-1 – x_i)

Sustituyendo en la fórmula de Newton-Raphson obtenemos:

x_i+1 = x_i – f(x_i)/f'(x_i) ≈ x_i – (f(x_i) * (x_i-1 – x_i) / f(x_i-1) – f(x_i))

Requisitos previos

Es importante notar que para poder calcular la siguiente aproximación x_i+1 necesitamos conocer las dos aproximaciones anteriores, x_i y x_i-1.

Diagrama de flujo

secant
Diagrama de flujo del método secante

Criterio de detención del método

El método de la secante se detendrá cuando el error iterativo (ε) sea lo suficientemente pequeño, para lograr un nivel de precisión lo suficientemente aceptable.

Cabe destacar que el orden de convergencia en un punto cercano a la solución es φ (número áureo). En caso de que la aproximación inicial sea demasiado lejana o la raíz no sea simple, este método no asegura la convergencia.

Código fuente


#include 
 
#ifndef MINERR
#define MINERR 1E-6
#endif
 
typedef double 
Continue reading "Método de la Secante"

Comparativo

--Originally published at conzmr.wordpress.com

Método Tipo Requisitos Riesgos Convergencia Ventajas Desventajas Tolerancia al error Tipo de raíces que encuentra Cuántas raíces encuentra
Bisección cerrado Se debe saber de antemano un intervalo en donde la función contiene una raíz, además, la función debe ser continua en un intervalo de busqueda [a, b] Ninguno si se cumple con los requisitos previos Si se cumple con los requisitos previos se garantiza su convergencia Es mucho más seguro que otros métodos en el sentido de que garantiza la convergencia Es menos eficiente que el método de Newton-Raphson Se usa el error absoluto Reales Una
Newton-Raphson abierto Sólo requiere un valor de inicio x y la derivada de la función A veces diverge o se aleja de la raíz verdadera a medida que se avanza en el cálculo. Con base en la serie de Taylor, tenemos que la velocidad de la convergencia está expresada por E_{i+1} = O(E_{i^2}); de esta manera el error debe de ser proporcional al cuadrado del error anterior Cuando sí converge, lo hacen mucho más rápido que los métodos cerrados en el caso de raíces múltiples e inclusive en raíces simples se nos pueden llegar a presentar algunas dificultades, como por ejemplo convergencia lenta o casos en el que un punto de inflexión* se encuentra en la vecindad de una raíz Se usa el error iterativo Reales Una
Secante abierto necesitamos conocer las dos aproximaciones anteriores la convergencia no se asegura si la primera aproximación a la raíz no es lo suficientemente cercana a ella, ni tampoco se asegura cuando la raíz es múltiple el orden de convergencia en un punto cercano a la solución es φ (número áureo). En caso de que la aproximación inicial sea demasiado lejana o la raíz no sea simple, este método no asegura la convergencia No se necesita
Continue reading "Comparativo"

Regresión lineal

--Originally published at conzmr.wordpress.com

En quince casas de la ciudad se observó durante un período de tiempo la diferencia de temperatura promedio (en grados centígrados) entre la temperatura en la calle y la temperatura en casa, y el consumo de electricidad diario en kWh.

Graficas de datos

temp_diff_vs_kWh

Podemos percibir que entre más sube la diferencia de temperatura entre la casa y la calle
suele haber más consumo de energía eléctrica.

Aplique regresión lineal y obtenga la función lineal que se ajusta a estas mediciones.

corriendo el siguiente código con los datos proporcionados obtenemos los resuldatos de a1 = 3.39553 a0 = 37.1618, lo que quiere decir que el y = 37.1618 + 3.39553 * x es un modelo lineal que se ajusta apropiadamente a estos datos.

#include 
#include 
#include 

using namespace std;

double *linear_regression(unsigned n, string x_file, string y_file) {
  double s_x, s_y, s_x2, s_p, mu_x, mu_y, std_x, std_y, std_xy, a0, a1;

  double *xs = (double *) calloc(n, sizeof(double));
  double *ys = (double *) calloc(n, sizeof(double));

  ifstream x_stream(x_file);
  ifstream y_stream(y_file);

  cout << "X" << "\t" << "y" << endl;
  cout << "----" << "\t" << "----" << endl;
  for (size_t i = 0; x_stream && y_stream && i < n; i++) {     double x, y;     x_stream >> x;
    y_stream >> y;

    xs[i] = x;
    ys[i] = y;

    s_x += x;
    s_y += y;
    s_x2 += x * x;
    s_p += x * y;

    cout << x << "\t" << y << endl;
  }

  x_stream.close();
  y_stream.close();

  mu_x = s_x / n;
  mu_y = s_y / n;

  for (size_t i = 0; i < n; i++) {
    std_x += pow(xs[i] - mu_x, 2);
    std_y += pow(ys[i] - mu_y, 2);
    std_xy += (xs[i] - mu_x) * (ys[i] - mu_y);
  }

  // standard deviation
  std_x = sqrt(std_x/n);
  std_x = sqrt(std_y/n);
  std_xy /= 
correlacion
linear_regression_plot
Continue reading "Regresión lineal"

Método de Jacobi & Método de Gauss-Seidel

--Originally published at conzmr.wordpress.com

Introducción y antecedentes

Ambos son métodos semejantes, usados para calcular la solución a un sistema de ecuaciones lineales (De forma Ax = b).

Requisitos de los métodos

Para ambos:

  • El sistema de ecuaciones se tiene que poder representar en una matriz cuadrada
  • La diagonal no debe tener elementos nulos
  • La matriz tiene que ser dominante (Los elementos en la diagonal tienen que tener el coeficiente de mayor magnitud de la ecuación)

Diferencias

En Jacobi, para cada iteración, se usan los valores previamente estimados de las variables (O si es la primer iteración, los valores de las variables definidas por el usuario o las default). En cambio en Gauss-Seidel, el método va reemplazando las variables calculadas en la iteración anterior, por las de la iteración actual inmediatamente. Así el método reduce el número de iteraciones totales.

Diagramas de flujo

Se realizaron los diagramas de flujo para resolver un sistema de 3 ecuaciones y 3 incógnitas

Jacobi

Jacobi

Gauss-Seidel

Gauss-Seidel

¿Es un método iterativo?

Sí. Al final de cada iteración, el método ya tiene una aproximación a la solución. Durante la siguiente iteración, se utilizan los resultados previos obtenidos para calcular las nuevas soluciones.

Criterio de convergencia de los métodos

Cuando después de las suficientes iteraciones el error sea menor al error minimo definido se considera que el método convergío exitosamente. En general, si la matriz de coeficientes original del sistema de ecuaciones es diagonalmente dominante, el método de converge.

Relajación

En optimización matemática, la Relajación es una aproximación a un problema difícil por medio de un problema cercano que es más facil de resolver.


Método de Bairstow

--Originally published at conzmr.wordpress.com

Si un polinomio tiene todos sus coeficientes reales, entonces puede tener raíces reales o complejas. El método de Bairstow es un algoritmo eficiente de búsqueda de las raíces de un polinomio real de grado arbitrario; es un método iterativo relacionado con los métodos de Muller y Newton Raphson.
Este algoritmo se diferencia de otros métodos porque encuentra tanto las raíces reales como las imaginarias (en parejas complejas conjugadas), utilizando únicamente aritmética real.

El método consiste en el cálculo de las raíces de un polinomio buscando factores cuadráticos x^2-rx-s. Se aplica la división del polinomio fn(x)=a0+a1x+a2x^2+..+anx^n entre el factor antes mecionado, resultando fn-1(x) = b2+b3x+b4x^2+…+bn-1x^n-3+bnx^n-2, con residuo R=b1(x-r)+b0.
Y aplicando la relación de recurrencia se obtienen los siguientes coeficientes:
bn=an
bn-1=an-1+rbn
bi = ai + rbi+1 + sbi+2, para i = n-2 hasta 0
Para poder encontrar raíces con este método necesitamos conocer el grado del polinomio a resolver, cuáles son sus coeficientes y dos factores, r y s, los cuales son necesarios para efectuar la división sintética.
Corremos el algoritmo en base a un error previamente establecido, tanto para los valores r y
 screenshot-from-2017-03-05-01-46-08
 Y cuando los dos valores fallan bajo el criterio previamente especificado las raíces se determinan mediante la ecuación
screenshot-from-2017-03-05-01-46-08

Newton-Raphson

--Originally published at conzmr.wordpress.com

Newton-Raphson es un método abierto, sólo requiere un valor de inicio x, que emplea una fórmula para predecir la raíz. El problema con esta clase de métodos es que a veces divergen o se alejan de la raíz verdadera a medida que se avanza en el cálculo. Entoces, ¿por qué utilizarlos? Pues porque cuando sí convergen, en general, lo hacen mucho más rápido que los métodos cerrados.

De las fórmulas para localizar raíces, la de Newton-Raphson puede que sea la más ampliamente utilizada. Si el valor inicial para la raíz es xi, entonces se puede trazar una tangente desde el punto [xi, f(xi)] de la curva; comunmente el punto donde dicha tangente cruza el eje x representa una aproximación mejorada de la raíz. EL método se deduce a partir de la interpretación geométrica basada en la serie de Taylor.

f'(xi) = f(xi)-0/(xi-xi+1) -> xi+1 = xi – f(xi)/f'(xi)

¿Cuál es el criterio de terminación que se utiliza? Con base en la serie de Taylor, tenemos que la velocidad de la convergencia está expresada por Ei+1 = O(Ei^2); de esta manera el error debe de ser proporcional al cuadrado del error anterior, es decir, el número de cifras significativas de precisión aproximadamente se duplica en cada iteración.

En general, el método de Newton’Raphson es muy eficiente, pero hay situaciones en donde se comporta de manera deficiente. Por ejemlo, en el caso de raíces múltiples e inclusive en raíces simples se nos pueden llegar a presentar algunas dificultades, como por ejemplo convergencia lenta o casos en el que un punto de inflexión* se encuentra en la vecindad de una raíz.

*Un punto de inflexión, en una función matemática, es un puntodonde los valores de una función continua x pasan de un tipo de concavidad a otra. La
Continue reading "Newton-Raphson"

Método de bisección

--Originally published at conzmr.wordpress.com

El método de la bisección es un algoritmo de búsqueda de raíces de ecuaciones, perteneciente a los métodos cerrados. ¿Qué quiere decir esto?, nos referimos a que es un método que nos ayuda a encontrar en qué puntos nuestra función intersecta el eje x (f(x)=0 son nuestras raíces); y por cerrado hacemos referencia a que se “aprovecha” del hecho de que una función cambia de signo en la vecindad de una raíz; también se les suele llamar de intervalos porque se necesitan dos valores iniciales definiendo en dónde es que vamos a buscar la raíz. Además de cerrado, es un método de búsqueda incremental. Cada vez, nuestro resultado se vuelve más exacto al dividir el intervalo en varios subintervalos.

Los métodos gráficos son buenos para poder determinar tales valores iniciales, además de que permiten visualizar propiedades de las funciones y el comportamiento del método (de cualquiera, claro, pero en este caso hablamos del de bisección).

Este algoritmo consiste en dividir por la mitad el intervalo dado, verificando primero que realmente en este se encuentra una raíz. Pero, ¿cómo sabemos que efectivamente hay al menos una? Simplemente, si nuestra función f(x) es real y continua en un intervalo [a,b] y f(a) y f(b) tienen signos opuestos, es decir, f(a)*f(b)<0; entonces podemos afirmarlo. Entonces, se localiza en cuál de los subintervalos persiste el cambio de signo, y este se convierte en nuestro nuevo intervalo sobre el cual repetimos este proceso mejorando cada vez más y más nuestra aproximación en la medida en que nuestros subintervalos se vuelven más pequeños.

¿Cuándo debemos parar?

 

Este es el código que desarrollé para probar el método:

#include <iostream>
#include <cmath>
#include <math.h>
#include <cstdlib>
#include <iomanip>
#if defined(_USE_MATH_DEFINES) && !defined(_MATH_DEFINES_DEFINED)
#define _MATH_DEFINES_DEFINED
#define M_E 2.71828182845904523536
#endif

using namespace std;
double f(double x);

Continue reading "Método de bisección"