ทำไมไม่ใช้ "สมการปกติ" เพื่อหาค่าสัมประสิทธิ์กำลังสองน้อยที่สุดอย่างง่าย?


17

ฉันเห็นรายการนี้ที่นี่และไม่อยากจะเชื่อว่ามีวิธีมากมายในการแก้ปัญหากำลังสองน้อยที่สุด "การสมปกติ" ในวิกิพีเดียดูเหมือนจะเป็นทางข้างหน้าค่อนข้างตรง: α

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

ดังนั้นทำไมไม่ใช้เพียงแค่พวกเขา? ฉันสันนิษฐานว่าจะต้องมีปัญหาการคำนวณหรือความแม่นยำเนื่องจากในลิงค์แรกเหนือ Mark L. Stone กล่าวว่า SVD หรือ QR เป็นวิธีที่ได้รับความนิยมในซอฟต์แวร์ทางสถิติและสมการปกติคือ "TERRIBLE จากความน่าเชื่อถือและความแม่นยำเชิงตัวเลข" อย่างไรก็ตามในรหัสต่อไปนี้สมการปกติทำให้ฉันมีความแม่นยำถึง ~ 12 ตำแหน่งทศนิยมเมื่อเทียบกับสามฟังก์ชั่นหลามยอดนิยม: numpy polyfit ; SciPy ของlinregress ; และ scikit การเรียนรู้ของการถดถอยเชิงเส้น

สิ่งที่น่าสนใจกว่าคือวิธีสมการปกตินั้นเร็วที่สุดเมื่อ n = 100000000 เวลาในการคำนวณสำหรับฉันคือ: 2.5 วินาทีสำหรับ linregress; 12.9s สำหรับ polyfit 4.2 วินาทีสำหรับ LinearRegression; และ 1.8s สำหรับสมการปกติ

รหัส:

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) 

คำตอบนั้นค่อนข้างพูดเกินจริง มันไม่น่ากลัวนักถ้าคุณเพียงหลีกเลี่ยงการคำนวณค่าอินเวอร์ส
คณิตศาสตร์ที่

3
หมายเหตุสองสามข้อเกี่ยวกับความเร็ว: คุณแค่มองโควาเรียเพียงตัวเดียวดังนั้นค่าใช้จ่ายในการผกผันของเมทริกซ์จึงเป็น 0 ถ้าคุณดูที่โควารีสองสามพันค่านั้นจะเปลี่ยนไป ข้อที่สองเนื่องจากคุณมีโควาเรียต์เพียงตัวเดียวการบันทึกข้อมูลคือสิ่งที่ใช้เวลาของคุณในการแข่งขันกับแพ็คเกจที่บรรจุ (แต่สิ่งนี้ควรปรับขนาดเชิงเส้นเท่านั้นไม่ใช่เรื่องใหญ่) โซลูชันสมการปกติไม่ได้ทำการแมปข้อมูลดังนั้นจึงเร็วกว่า แต่ไม่มีเสียงระฆังและเสียงนกหวีดแนบมากับผลลัพธ์
หน้าผา AB

คำตอบ:


22

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

1081016

บางครั้งคุณก็หนีไปจากสมการปกติและบางครั้งคุณก็ทำไม่ได้


2
วิธีที่ง่ายกว่าในการดู (ถ้าคุณไม่รู้ / สนใจเกี่ยวกับหมายเลขเงื่อนไข) คือคุณกำลัง (โดยพื้นฐาน) คูณบางอย่างด้วยตัวเอง ("กำลังสอง" มัน) ซึ่งหมายความว่าคุณสามารถคาดหวังว่าจะสูญเสียบิตครึ่ง ความแม่นยำ (สิ่งนี้ควรชัดเจนกว่านี้ถ้า A เป็นสเกลาร์และควรเห็นได้ง่ายว่าการสร้างเมทริกซ์ A ไม่ได้เปลี่ยนปัญหาพื้นฐานจริงๆ)
user541686

นอกจากความถูกต้องที่แตกต่างกันแล้วยังมีความแตกต่างความเร็วสูงระหว่าง QR และสมการปกติหรือไม่? เพราะในกรณีหลังคุณอาจกำลังแก้ไข (X'X) -1 * X'Y ซึ่งช้าเพราะผกผัน? ฉันถามเพราะฉันไม่แน่ใจว่า QR ทำงานอย่างไรดังนั้นอาจมีบางอย่างที่ช้าพอ ๆ กับการเมทริกซ์ หรือเป็นเพียงจุดเดียวในการพิจารณาการสูญเสียความแม่นยำ?
Simon

4
ATAATb

8

หากคุณเพียงแค่ต้องแก้ปัญหาตัวแปรนี้แล้วไปข้างหน้าและใช้สูตร ไม่มีอะไรผิดปกติกับมัน ฉันเห็นคุณเขียนโค้ดสองสามบรรทัดใน ASM สำหรับอุปกรณ์ฝังตัวเช่น จริงๆแล้วฉันใช้วิธีแก้ปัญหาแบบนี้ในบางสถานการณ์ คุณไม่จำเป็นต้องลากไลบรารี่สถิติขนาดใหญ่เพียงเพื่อแก้ปัญหาเล็ก ๆ น้อย ๆ นี้แน่นอน

ความไม่แน่นอนเชิงตัวเลขและประสิทธิภาพเป็นปัญหาของปัญหาที่ใหญ่กว่าและการตั้งค่าทั่วไป หากคุณแก้หลายตัวแปรกำลังสองน้อยที่สุดเป็นต้นสำหรับปัญหาทั่วไปคุณจะไม่ใช้มันแน่นอน


0

ไม่มีแพ็คเกจทางสถิติที่ทันสมัยจะแก้ปัญหาการถดถอยเชิงเส้นด้วยสมการปกติ สมการปกติมีอยู่ในหนังสือสถิติเท่านั้น

ไม่ควรใช้สมการปกติในการคำนวณอินเวอร์สของเมทริกซ์เป็นปัญหามาก

เหตุใดจึงใช้การไล่ระดับสีแบบลาดชันสำหรับการถดถอยเชิงเส้นเมื่อมีวิธีการแก้ปัญหาคณิตศาสตร์แบบปิด

... แม้ว่าจะมีสมการเชิงเส้นตรง โปรดสังเกตว่าในสมการปกติเราต้องกลับเมทริกซ์ ทีนี้การกลับค่าใช้จ่ายเมทริกซ์ O (N3) สำหรับการคำนวณโดยที่ N คือจำนวนแถวในเมทริกซ์ X นั่นคือการสังเกต ยิ่งไปกว่านั้นถ้า X มีเงื่อนไขแล้วมันจะสร้างข้อผิดพลาดในการคำนวณ ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.