AlgoVerse

کمترین مربعات (برازش خط)

خطی را پیدا می‌کند که جمع مربع فاصله‌های عمودی نقطه‌ها از آن کمترین باشد؛ با حل دو معادله‌ی نرمال، با کسرهای دقیق.

نقطه‌های (x, y) تقریباً روی یک خط‌اند ولی دقیقاً نه. کمترین مربعات خطی y = c0 + c1·x را انتخاب می‌کند که جمع مربع خطاها Σ (y − c0 − c1·x)² کمترین باشد.

ادامه‌ی توضیح ↓
ورودی:
points 5×2خروجی PDF

پنج نقطه که تقریباً روی یک خط‌اند؛ خط برازش y = 3/5 + 21/10·x است و خطاها جمع صفر دارند.

  1. from fractions import Fraction
  2. def least_squares(points):
  3. # The line y = c0 + c1·x with the smallest sum of squared vertical errors.
  4. n = len(points)
  5. sx = sy = sxx = sxy = 0
  6. for x, y in points:
  7. sx = sx + x
  8. sy = sy + y
  9. sxx = sxx + x * x
  10. sxy = sxy + x * y
  11. # The normal equations: n·c0 + sx·c1 = sy and sx·c0 + sxx·c1 = sxy.
  12. det = n * sxx - sx * sx
  13. if det == 0:
  14. return None
  15. c0 = Fraction(sy * sxx - sx * sxy, det)
  16. c1 = Fraction(n * sxy - sx * sy, det)
  17. rows = []
  18. for x, y in points:
  19. guess = c0 + c1 * x
  20. rows.append((x, y, guess, y - guess))
  21. return str(c0), str(c1)

ناوردا: در خط بهینه، جمع خطاها صفر است و جمع خطاها ضرب در x هم صفر است؛ همین دو شرط دو معادله‌ی نرمال‌اند.

شروع اجرا

c0—
c1—

points

01
12
25
37
49

rows

جدول هنوز خالی است.

متغیرهای محلی

نارنجی = در همین گام عوض شد

points list

[0, 1][1, 2][2, 5][3, 7][4, 9]

Call stack

  1. least_squares()خط 4
گام ۱ از ۵۱
خط سیاه = fit · خط نارنجی = گام کلیدیadd_point: 0/5 · normal_equations: 0/1 · fit: 0/1 · residual: 0/5
    توضیح

    ایده

    نقطه‌های (x, y) تقریباً روی یک خط‌اند ولی دقیقاً نه. کمترین مربعات خطی y = c0 + c1·x را انتخاب می‌کند که جمع مربع خطاها Σ (y − c0 − c1·x)² کمترین باشد.

    معادله‌های نرمال

    با مشتق‌گیری نسبت به c0 و c1 و برابر صفر قرار دادن، دو معادله‌ی خطی به دست می‌آید:

    n·c0  + Σx·c1  = Σy
    Σx·c0 + Σx²·c1 = Σxy
    

    این همان Aᵀ·A·c = Aᵀ·y است که A ستون‌های 1 و x دارد؛ برای چندجمله‌ای‌های درجه‌ی بالاتر هم همین روش با ستون‌های x², x³, … کار می‌کند.

    در trace به چه چیزی نگاه کنی

    • جدول rows برای هر نقطه پیش‌بینی خط و خطا را نشان می‌دهد؛ جمع ستون خطا صفر است.