# Mínimos Cuadrados
## Ecuaciones normales


```python
import numpy as np
import scipy.linalg as spla
import matplotlib.pyplot as plt
np.random.seed(123)
```

### Modelos
Definición de modelos 
* Lineal: $f(t)=c_1 + c_2\, t$
* Cuadrático: $f(t)=c_1 + c_2\, t + c_3\, t^2$
* Exponencial: $f(t)=c_1\,e^{c_2\,t}$
* Periódico: $f(t)=c_1 + c_2\,\cos(2\pi t) + c_3\,\sin(2\pi t) + c_4\, \cos(4\pi t)$*
* Ley de potencia: $f(t)=c_1t^{c_2}$


```python
lm = lambda c_1, c_2, t: c_1 + c_2 * t
qm = lambda c_1, c_2, c_3, t: c_1 + c_2 * t + c_3 * t ** 2
em = lambda c_1, c_2, t: c_1 * np.exp(c_2 * t)
sm = lambda c_1, c_2, c_3, c_4, t: c_1 + c_2 * np.cos(2 * np.pi * t) + c_3 * np.sin(2 * np.pi * t) + c_4 * np.cos(4 * np.pi * t)
pm = lambda c_1, c_2, t: c_1 * t ** c_2
```

### Resolución de ecuaciones normales

\begin{equation}
    A^*A\,\mathbf{x} = A^*\mathbf{b}
\end{equation}


```python
# A^*A x = A^* b
def normalEquations(A, b):
    #return np.dot(np.linalg.inv(np.dot(A.T, A)), np.dot(A.T, b)) 
    return np.linalg.solve(np.dot(A.T, A), np.dot(A.T, b))
```


```python
def plot(t, y, tt, yy):
    plt.figure(figsize=(12, 6))
    plt.plot(t, y, 'r.')
    plt.plot(tt, yy)
    plt.grid(True)
    plt.xlabel(r'$t$')
    plt.ylabel(r'$y$')
    plt.show()
```

Se define un $t\in[0.1, \pi]$


```python
n = 200
t = np.linspace(0.1, np.pi, n)
tt = np.linspace(0.1, np.pi, 3 * n)
```

Para probar los modelos, se generan datos "cocinados" utilizando de base el modelo + "ruido".

## Lineal


```python
y_l = lm(1, 2, t) + np.random.normal(1.5, .5, n) # Data
A_l = np.ones((n, 2))
A_l[:,1] = t
b_l = y_l
```


```python
p_l = normalEquations(A_l, b_l)
```


```python
print("Parámetros: c1=%f, c2=%f"%(p_l[0], p_l[1]))
```

    Parámetros: c1=2.543600, c2=1.974268



```python
plot(t, y_l, tt, lm(*p_l, tt))
```

## Cuadrático


```python
y_q = qm(1, 2, 3, t) + np.random.normal(5, 3, n)
A_q = np.ones((n, 3))
A_q[:, 1] = t
A_q[:, 2] = t ** 2
b_q = y_q
```


```python
p_q = normalEquations(A_q, b_q)
```


```python
print("Parámetros: c1=%f, c2=%f, c3=%f"%(p_q[0], p_q[1], p_q[2]))
```

    Parámetros: c1=6.018403, c2=1.682171, c3=3.045116



```python
plot(t, y_q, tt, qm(*p_q, tt))
```

## Periódico


```python
y_s = sm(1, 2, 2, 1, t) + np.random.normal(10, 2, n)
A_s = np.ones((n, 4))
A_s[:, 1] = np.cos(2 * np.pi * t)
A_s[:, 2] = np.sin(2 * np.pi * t)
A_s[:, 3] = np.cos(4 * np.pi * t)
b_s = y_s
```


```python
p_s = normalEquations(A_s, b_s)
```


```python
print("Parámetros: c1=%f, c2=%f, c3=%f, c4=%f"%(p_s[0], p_s[1], p_s[2], p_s[3]))
```

    Parámetros: c1=11.137206, c2=2.134255, c3=1.776716, c4=0.983177



```python
plot(t, y_s, tt, sm(*p_s, tt))
```

## Exponencial


```python
y_e = 10 + em(1, 1.5, t) + np.random.normal(5, 5, n)
A_e = np.ones((n, 2))
A_e[:, 1] = t
b_e = np.log(y_e)
```


```python
p_e = normalEquations(A_e, b_e)
```


```python
print("Parámetros: c1=%f, c2=%f"%(p_e[0], p_e[1]))
```

    Parámetros: c1=2.358559, c2=0.672321



```python
plot(t, y_e, tt,  em(np.exp(p_e[0]), p_e[1], tt))
```

### En escala logarítmica


```python
plot(t, b_e, tt, lm(*p_e, tt))
```

## Ley de potencia


```python
y_p = pm(3, 4, t) * np.random.normal(5, 1, n) 
A_p = np.ones((n, 2))
A_p[:, 1] = np.log(t)
b_p = np.log(y_p)
```


```python
p_p = normalEquations(A_p, b_p)
```


```python
print("Parámetros: c1=%f, c2=%f"%(p_p[0], p_p[1]))
```

    Parámetros: c1=2.665977, c2=3.992915



```python
plot(t, y_p, tt, pm(np.exp(p_p[0]), p_p[1], tt))
```

### En escala logarítmica


```python
plot(np.log(t), np.log(y_p), np.log(tt), lm(*p_p, np.log(tt)))
```

# Comentarios

* Basta un método de resolución para las ecuaciones normales, la diferencia aparece en la construcción de $A$, $\mathbf{b}$ y $\mathbf{x}$ con la cantidad de parámetros de los modelos.

b02d0136d54d31dfaf2233c3d7c2de0de36109ca
ipynb
Jupyter Notebook
material/06_minimos_cuadrados/ecuaciones_normales.ipynb
fitoxgs2/INF-285
f7d547c2480aea7eb1242b873ab1135a0873834f
BSD-3-Clause
2020-04-24T01:25:24.000Z
2021-05-10T01:08:37.000Z
material/06_minimos_cuadrados/ecuaciones_normales.ipynb
fitoxgs2/INF-285
f7d547c2480aea7eb1242b873ab1135a0873834f
BSD-3-Clause
2020-04-22T00:57:29.000Z
2020-04-23T23:59:28.000Z
material/06_minimos_cuadrados/ecuaciones_normales.ipynb
fitoxgs2/INF-285
f7d547c2480aea7eb1242b873ab1135a0873834f
BSD-3-Clause
2020-04-20T01:15:09.000Z
2020-07-27T22:53:59.000Z
Qwen/Qwen-72B
1. YES
2. YES