Neden basit en küçük kareler katsayılarını bulmak için “normal denklemleri” kullanmıyorsunuz?


17

Bu listeyi burada gördüm ve en küçük kareleri çözmenin birçok yolu olduğuna inanamadım. Wikipedia'daki "normal denklemler" oldukça basit bir yol gibi görünüyordu:

α^=y¯β^x¯,β^=i=1n(xix¯)(yiy¯)i=1n(xix¯)2

Öyleyse neden sadece onları kullanmıyorsunuz? Mark L'nin ilk bağlantısında SVD veya QR'nin istatistiksel yazılımda popüler yöntemler olduğunu ve normal denklemlerin "güvenilirlik ve sayısal doğruluk açısından KORKUNÇ" olduğunu belirttiği için bir hesaplama veya kesinlik sorunu olduğunu varsaydım. Ancak , aşağıdaki kodda, normal denklemler üç popüler python fonksiyonu ile karşılaştırıldığında ~ 12 ondalık basamağa doğruluk veriyor: numpy's polyfit ; scipy en linregress ; ve scikit-learn'un LinearRegression'ı .

Daha ilginç olan, n = 100000000 olduğunda normal denklem yönteminin en hızlı olmasıdır. Benim için hesaplama süreleri: Linregress için 2.5s; Polifit için 12.9s; LinearRegression için 4.2'ler; ve normal denklem için 1.8s.

Kod:

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) 

Cevaplar oldukça abartılı. Tersi açıkça hesaplamaktan kaçınırsanız o kadar korkunç değil.
mathreadler

3
Hızla ilgili birkaç not: sadece tek bir ortak değişkene bakıyorsunuz, bu nedenle matris inversiyonunun maliyeti esasen 0'dır. Birkaç bin ortak değişkene bakarsanız, bu değişecektir. İkincisi, sadece tek bir ortak değişkene sahip olduğunuz için, veri-munging, paketlenmiş rakiplerde aslında çok fazla zaman alan şeydir (ancak bu sadece doğrusal olarak ölçeklenmelidir, bu yüzden büyük bir anlaşma değil). Normal denklemler çözümü veri taraması yapmaz, bu yüzden daha hızlıdır, ancak sonuçlarına bağlı çan ve ıslık yoktur.
Cliff AB

Yanıtlar:


23

AxbAATAlog10(cond)ATAATAx=ATblog10(cond(ATA))=2log10(cond(A))

1081016

Bazen Normal denklemlerden kaçarsınız, bazen de almazsınız.


2
Bunu görmenin daha basit bir yolu (koşul sayılarını bilmiyorsanız / umursamıyorsanız) (esasen) bir şeyi kendinizle çarpmanızdır ("kare"), yani bitlerinizin yaklaşık yarısını kaybetmeyi bekleyebilirsiniz. hassas. (A, bir skaler ise bu daha açık olmalıdır ve A matrisi yapmanın altta yatan problemi gerçekten değiştirmediğini görmek kolay olmalıdır.)
user541686

Doğruluk farklarının yanı sıra, QR ve normal denklemler arasında da büyük bir hız farkı var mı? çünkü ikinci durumda (X'X) -1 * X'Y'yi çözüyor olabilirsiniz, bu tersi için yavaştır? Soruyorum çünkü QR'nin nasıl çalıştığından emin değilim, bu yüzden orada bir matrisi ters çevirmek kadar yavaş bir şey var. Yoksa tek dikkat edilecek nokta doğruluk kaybı mıdır?
Simon

4
ATAATb

8

Bu tek değişkenli sorunu çözmeniz gerekiyorsa devam edin ve formülü kullanın. Bunda yanlış bir şey yok. Örneğin, gömülü bir cihaz için ASM'de birkaç satır kod yazdığınızı görebiliyordum. Aslında, bazı durumlarda bu tür bir çözüm kullandım. Tabii ki bu küçük sorunu çözmek için büyük istatistiksel kütüphaneleri sürüklemenize gerek yok.

Sayısal istikrarsızlık ve performans, daha büyük sorunların ve genel ortamın sorunlarıdır. Çok değişkenli en küçük kareleri vb. Çözerseniz. Genel bir sorun için bunu elbette kullanmazsınız.


0

Hiçbir modern istatistiksel paket, normal denklemlerle doğrusal bir regresyonu çözemez. Normal denklemler sadece istatistiksel kitaplarda bulunur.

Matrisin tersinin hesaplanması çok problemli olduğu için normal denklemler kullanılmamalıdır.

Kapalı biçimli bir matematik çözümü bulunduğunda neden doğrusal regresyon için degrade iniş kullanılır?

... doğrudan normal denklem mevcut olmasına rağmen. Normal denklemde bir matrisin ters çevrilmesi gerektiğine dikkat edin. Şimdi bir matrisin tersine çevrilmesi hesaplama için O (N3) 'e mal olur, burada N, X matrisindeki satır sayısıdır, yani gözlemler. Dahası, eğer X hastalanırsa, o zaman hesaplamada hesaplama hataları yaratacaktır ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.