Otázka:
Proč nepoužívat „normální rovnice“ k vyhledání jednoduchých koeficientů nejmenších čtverců?
Oliver Angelil
2018-04-27 07:00:08 UTC
view on stackexchange narkive permalink

Viděl jsem tento seznam zde a nemohl jsem uvěřit, že existuje tolik způsobů řešení nejmenších čtverců. „Normální rovnice“ na Wikipedii se zdály být docela přímočarým způsobem: $$ {\ 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 {zarovnáno}}} $$

Proč je tedy nepoužívat? Předpokládal jsem, že musí existovat problém s výpočtem nebo přesností, protože v prvním odkazu výše Mark L. Stone uvádí, že SVD nebo QR jsou populární metody statistického softwaru a že normální rovnice jsou „TERRIBLE z hlediska spolehlivosti a numerické přesnosti“. Nicméně v následujícím kódu mi normální rovnice dávají přesnost na ~ 12 desetinných míst ve srovnání se třemi populárními funkcemi pythonu: numpy's polyfit; linregress společnosti scipy; a LinearRegression společnosti scikit-learn.

Zajímavější je, že metoda běžných rovnic je nejrychlejší, když n = 100000000. Výpočetní časy pro mě jsou: 2,5 s pro linregress; 12,9 s pro polyfit; 4,2 s pro lineární regrese; a 1,8 s pro normální rovnici.

Kód:

  import numpy jako np
ze sklearn.linear_model import LinearRegression
ze scipy.stats import linregress
importovat čas

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 ()
tisk (stop - start)

# numpy
start = timeit.default_timer ()
print (str.format ('{0: .30f}', np.polyfit (x, y, 1) [0]))
stop = timeit.default_timer ()
tisk (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]))
tisk (stop - start)

# normální rovnice
start = timeit.default_timer ()
sklon = np.sum ((x-x.mean ()) * (y-y.mean ())) / np.sum ((x-x.mean ()) ** 2)
stop = timeit.default_timer ()
print (str.format ('{0: .30f}', sklon))
tisk (stop - start)
 
Odpovědi jsou docela přehnané.Není to tak hrozné, pokud se vyhnete výslovně výpočtu inverze.
Několik poznámek k rychlosti: díváte se pouze na jednu kovariát, takže cena inverze matice je v podstatě 0. Pokud se podíváte na několik tisíc kovariát, změní se to.Zadruhé, protože máte pouze jednu kovariátu, je munging dat tím, co ve skutečnosti trvá hodně času u zabalených konkurentů (ale toto by se mělo měnit pouze lineárně, takže to není velký problém).Řešení normálních rovnic nedělá data munging, takže je to rychlejší, ale s výsledky nemá žádné zvonky a píšťalky.
Tři odpovědi:
Mark L. Stone
2018-04-27 07:21:22 UTC
view on stackexchange narkive permalink

U problému $ Ax \ cca b $, vytvoření normálových rovnic druhé mocninu počtu podmínek $ A $ vytvořením $ A ^ TA $. Zhruba řečeno $ log_ {10} (cond) $ je počet číslic, které při výpočtu ztratíte, pokud je vše v pořádku. A to ve skutečnosti nemá nic společného s vytvořením inverzní funkce $ A ^ TA $. Bez ohledu na to, jak je $ A ^ TAx = A ^ Tb $ vyřešeno, jste již ztratili $ log_ {10} (cond (A ^ TA)) = 2 * log_ {10} (cond (A)) $ číslic přesnosti . Tj. Vytvoření normálových rovnic zdvojnásobilo počet ztracených číslic přesnosti, a to hned po pálce.

Pokud je číslo podmínky malé (jedno je nejlepší možné), na tom příliš nezáleží. Pokud číslo podmínky = $ 10 ^ 8 $ a používáte stabilní metodu, jako je QR nebo SVD, můžete mít přibližně 8 číslic přesnosti s dvojitou přesností. Pokud vytvoříte normální rovnice, zadali jste číslo podmínky na druhou na $ 10 ^ {16} $ a ve své odpovědi nemáte v podstatě žádnou přesnost.

Někdy vám normální rovnice uniknou, jindy ne.

Jednodušší způsob, jak to vidět (pokud nevíte / nezajímáte se o čísla podmínek), je to, že něco (v zásadě) znásobujete samy od sebe („srovnáváte to“), což znamená, že můžete očekávat ztrátu asi poloviny svých bitůpřesnost.(To by mělo být jasnější, pokud je A skalární, a mělo by být snadné vidět, že vytvoření matice ve skutečnosti nezmění základní problém.)
Kromě rozdílů v přesnosti existuje také velký rozdíl v rychlosti mezi QR a normálními rovnicemi?protože v druhém případě byste mohli řešit (X'X) -1 * X'Y, což je kvůli inverzi pomalé?Ptám se, protože si nejsem jistý, jak QR funguje, takže je tu něco, co je stejně pomalé jako převrácení matice.Nebo je jediným hlediskem ztráta přesnosti?
@Simon No, když vyřešíte normální rovnice, nikdy vlastně nevytvoříte inverzní matici, která je příliš pomalá.Musíte však vytvořit matici $ A ^ TA $ a vektor $ A ^ Tb $ a pak vyřešíte systém.
Aksakal
2018-04-27 07:13:11 UTC
view on stackexchange narkive permalink

Pokud musíte vyřešit pouze tento problém s jednou proměnnou, pokračujte a použijte vzorec.Na tom není nic špatného.Viděl jsem vás například psát několik řádků kódu v ASM pro vložené zařízení.Ve skutečnosti jsem tento druh řešení použil v některých situacích.K vyřešení tohoto malého problému samozřejmě nemusíte přetahovat velké statistické knihovny.

Numerická nestabilita a výkon jsou problémy větších problémů a obecného nastavení.Pokud řešíte vícerozměrné nejmenší čtverce atd. Pro obecný problém byste to samozřejmě nepoužívali.

SmallChess
2018-04-27 07:07:01 UTC
view on stackexchange narkive permalink

Žádný moderní statistický balíček by nevyřešil lineární regresi s normálními rovnicemi.Normální rovnice existují pouze ve statistických knihách.

Normální rovnice by se neměly používat, protože výpočet inverze matice je velmi problematický.

Proč používat gradientní sestup pro lineární regresi, když je k dispozici matematické řešení v uzavřené formě?

... ačkoli je k dispozici přímá normální rovnice.Všimněte si, že v normální rovnice je třeba převrátit matici.Nyní převrácení matice náklady O (N3) pro výpočet, kde N je počet řádků v X matici tj. pozorování.Navíc, pokud je X špatně podmíněné, pak to vytvoří v odhadu výpočetní chyby ...



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...