هموارسازی نمایی ساده، یک سطح را با ترکیب مشاهده تازه و سطح قبلی بهروز میکند. ضریب آلفا تعیین میکند مشاهده تازه چه وزنی در این اصلاح بگیرد. برای داده بدون الگوی روند و فصلمندیِ مدلشده میتواند یک روش پایه قابل بررسی باشد؛ این نسخه، روند یا چرخه فصلی جدا ندارد.
پیشبینی را پیش از دیدن واقعیت ثبت کنیم
قرارداد ما level_t = α×y_t +(۱−α)×level_previous است. سطح آغازین را برابر مشاهده اول میگیریم. پیشبینی یک گام بعد از زمان t، همان level_t است. بنابراین برای پیشبینی مشاهده سوم، نباید خود مشاهده سوم را وارد سطح کرده باشیم؛ مقدار تازه پس از مشاهده برای پیشبینی بعدی استفاده میشود.
در برخی متنها نمادگذاری با یک شماره جابهجا نوشته میشود. مهم این است که روشن کنید کدام مقدار در زمان پیشبینی واقعاً دیده شده است. منبع NIST هر دو قرارداد نمایشی را توضیح میدهد؛ کد این صفحه، شکل سطح پس از مشاهده را صریح انتخاب کرده است.
چهار مشاهده و آلفای نیم
دنباله ساختگی ۱۰،۱۴،۱۲ و۲۰ را میگیریم. با α=۰٫۵، سطح اول۱۰ است. پس از۱۴، سطح۰٫۵×۱۴+۰٫۵×۱۰=۱۲ میشود. پس از مشاهده۱۲، همان۱۲ میماند و پس از۲۰ به۱۶ میرسد.
| زمان | مشاهده | پیشبینی ثبتشدنی پیش از مشاهده | سطح پس از مشاهده |
|---|---|---|---|
| 1 | 10 | آغاز؛ در این تمرین نداریم | 10 |
| 2 | 14 | 10 | 12 |
| 3 | 12 | 12 | 12 |
| 4 | 20 | 12 | 16 |
| 5 | هنوز ندیدهایم | 16 | نیازمند مشاهده |
۱۶ برای زمان پنجم پیشبینی است، نه مقدار واقعیِ معلوم. با α=۰٫۲، سطحهای پس از مشاهده بهترتیب۱۰،۱۰٫۸،۱۱٫۰۴ و۱۲٫۸۳۲ میشوند. نرخ کوچکتر در این نمونه به جهش آخر آهستهتر پاسخ میدهد؛ از این چهار عدد نمیتوان بهترین آلفای یک پروژه دیگر را تعیین کرد.
کد با تفکیک forecast و level
import math
def smooth(values,alpha):
if not values or not 0<alpha<=1 or not all(math.isfinite(v) for v in values):
raise ValueError('finite nonempty values and 0<alpha<=1 required')
level=values[0]
levels=[level]
forecasts=[None]
for value in values[1:]:
forecasts.append(level) # prediction before seeing this observation
level=alpha*value+(1-alpha)*level
levels.append(level)
return forecasts,levels
values=[10.0,14.0,12.0,20.0]
for alpha in [0.5,0.2]:
forecasts,levels=smooth(values,alpha)
print(alpha,'one-step forecasts',forecasts,'levels',[round(z,6) for z in levels],
'next forecast',round(levels[-1],6))
f,l=smooth(values,0.5)
assert f==[None,10.0,12.0,12.0] and l==[10.0,12.0,12.0,16.0]
assert abs(smooth(values,0.2)[1][-1]-12.832)<1e-12
assert smooth(values,1.0)[0][1:]==values[:-1]فایل، پیشبینی قبل از دیدن هر مشاهده را جدا از سطح بعد از آن نگه میدارد. None برای زمان اول یعنی در این قرارداد پیشبینی اولیه مستقل نداریم؛ صفرِ پیشبینی نیست. با α=۱، هر پیشبینی یکگام بعد برابر آخرین مشاهده میشود. این حالت، نقطه مقایسه مفیدی با روش مقدار قبلی است.
این مدل چه چیزی را یاد نمیگیرد؟
نسخه ساده، رشد منظم یا فصلمندی را با جزء جدا مدل نمیکند. اگر داده در هر هفته الگوی متفاوت دارد، تکرار یک سطح ثابت برای همه افقها میتواند نامناسب باشد. فاصله نامنظم زمانی، مقدار گمشده و تغییر واحد هم باید پیش از بهروزرسانی کنترل شوند؛ این کد مقدار گمشده را پر یا زمان نامنظم را تنظیم نمیکند.
خط مبنای پیشبینی تقاضا درباره طراحی مقایسه با روش ساده است. این متن فرمول و دفتر عددی یک روش مشخص را اجرا کرد. برای کنترل اینکه آینده وارد ساخت پیشبینی نشده، نشت داده زمانی را کنار ارزیابی نگه دارید. انتخاب α باید روی توسعه انجام و عملکرد نهایی روی دوره جدا بررسی شود.
تمرین و تصمیم بعدی
فقط مقدار آخر را۲۰ به۱۲ عوض کنید و خروجی دو آلفا را دوباره ببینید؛ سپس مشخص کنید در کاربرد شما جهش واقعی است یا خطای ثبت. تغییر یک مشاهده آموزشی، شاهد بهبود عملیاتی نیست. اگر هدف، برنامهریزی پاسخگویی و پیگیری مشتری است، نیاز و واحد داده را برای بررسی با اپرا آماده کنید؛ این آموزش سرویس پیشبینی آماده یا توصیه قطعی تأمین موجودی ارائه نمیکند.
فایل تمرین و منابع
دریافت کد کامل این تمرین؛ این فایل فقط از کتابخانه استاندارد پایتون استفاده میکند. ورودیهای آن ساختگی و برای بازتولید محاسبهاند؛ اجرای آموزشی آن نتیجه یک محصول یا مشتری را نشان نمیدهد.
تاریخ بررسی منابع: ۳ نوامبر ۲۰۲۶. منابع، مرجع روشاند؛ دادهها، اعداد و کد مثال برای همین راهنما طراحی شدهاند.