18 votos

Por ejemplo, las ecuaciones normales en problemas de mínimos cuadrados lineales son problemas de esta forma.

Yo vi esta lista de aquí y no podía creer que había muchas formas de resolver los mínimos cuadrados. El "normal ecuaciones" en la Wikipedia que parecía ser una bastante sencilla: $$ {\displaystyle {\begin{aligned}{\hat {\alpha }}&={\bar {y}}-{\hat {\beta }}\,{\bar {x}},\\{\hat {\beta }}&={\frac {\sum _{i=1}^{n}(x_{i}-{\bar {x}})(y_{i}-{\bar {y}})}{\sum _{i=1}^{n}(x_{i}-{\bar {x}})^{2}}}\end{aligned}}} $$

Así que ¿por qué no usarlos? Supuse que no debe ser un computacional o precisión de la cuestión, dado que en el primer enlace sobre Mark L. Piedra, menciona que el SVD o QR son métodos populares en software estadístico y de que las ecuaciones normales son "TERRIBLES de la fiabilidad y la precisión numérica punto de vista". Sin embargo, en el código siguiente, la normal de ecuaciones me están dando la precisión de ~12 decimales cuando se compara con tres populares python funciones: numpy del polyfit; scipy del linregress; y scikit-learn LinearRegression.

Lo más interesante es que el normal de la ecuación es el método más rápido cuando n = 100000000. El tiempo de computación para mí son: 2.5 s para linregress; 12.9 s para polyfit; 4.2 s para LinearRegression; y 1.8 s para el normal de la ecuación.

Código:

import numpy as np
from sklearn.linear_model import LinearRegression
from scipy.stats import linregress
import timeit

b0 = 0
b1 = 1
n = 100000000
x = np.linspace(-5, 5, n)
np.random.seed(42)
e = np.random.randn(n)
y = b0 + b1*x + e

# scipy                                                                                                                                     
start = timeit.default_timer()
print(str.format('{0:.30f}', linregress(x, y)[0]))
stop = timeit.default_timer()
print(stop - start)

# numpy                                                                                                                                      
start = timeit.default_timer()
print(str.format('{0:.30f}', np.polyfit(x, y, 1)[0]))
stop = timeit.default_timer()
print(stop - start)

# sklearn                                                                                                                                    
clf = LinearRegression()
start = timeit.default_timer()
clf.fit(x.reshape(-1, 1), y.reshape(-1, 1))
stop = timeit.default_timer()
print(str.format('{0:.30f}', clf.coef_[0, 0]))
print(stop - start)

# normal equation                                                                                                                            
start = timeit.default_timer()
slope = np.sum((x-x.mean())*(y-y.mean()))/np.sum((x-x.mean())**2)
stop = timeit.default_timer()
print(str.format('{0:.30f}', slope))
print(stop - start) 

26voto

Mark L. Stone Puntos 2037

Para el problema de $Ax \approx b$, la formación de la Normal ecuaciones de las plazas de la condición de número de $A$ mediante la formación de $A^TA$. A grandes rasgos $log_{10}(cond)$ es el número de dígitos que usted pierde en su cálculo si todo se hace bien. Y esto en realidad no tiene nada que ver con la formación de la matriz inversa de a $A^TA$. No importa cuán $A^TAx = A^Tb$ está solucionado, ya has perdido $log_{10}(cond(A^TA)) = 2*log_{10}(cond(A))$ dígitos de precisión. I. e., la formación de la Normal de ecuaciones se ha duplicado el número de dígitos de precisión perdido, a la derecha del palo.

Si la condición número es pequeño (es el mejor posible), no importa mucho. Si la condición de numero = $10^8$ y utilizar un método estable como QR o de enfermedad vesicular porcina, que usted pueda tener acerca de 8 dígitos de precisión en doble precisión. Si se forma la Normal de ecuaciones, has cuadrado de la condición de número de $10^{16}$, y tiene esencialmente no hay precisión en la respuesta.

A veces te alejas con las ecuaciones Normales, y a veces no.

8voto

Aksakal Puntos 11351

Si usted sólo tiene que resolver esta variable problema, a continuación, seguir adelante y utilizar la fórmula. No hay nada de malo con ello. Pude ver que escribir un par de líneas de código en ASM para un dispositivo embebido, por ejemplo. De hecho, he utilizado una solución de este tipo en algunas situaciones. Usted no necesita arrastrar grandes estadística de bibliotecas de resolver este pequeño problema, por supuesto.

La inestabilidad numérica y el rendimiento son los problemas de los problemas más grandes y de configuración general. Si usted resolver multivariante menos plazas, etc. Para un problema general que no uso esto, por supuesto.

0voto

Mohammadreza Puntos 1964

No moderno paquete estadístico podría resolver una regresión lineal con la normal de ecuaciones. La normal de ecuaciones sólo existen en los libros de estadística.

La normal de ecuaciones no debe ser utilizado como calcular la inversa de la matriz es muy problemático.

¿Por qué utilizar gradiente de la pendiente de la regresión lineal, cuando una forma cerrada de matemáticas de la solución está disponible?

... aunque directa normal de la ecuación está disponible. Observe que en normal de la ecuación uno tiene que invertir una matriz. Ahora que la inversión de una matriz los costos de O(N3) para el cálculo, donde N es el número de filas de la matriz X es decir, las observaciones. Por otra parte, si la X está mal condicionado, a continuación, se se cree errores de cálculo en la estimación de...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X