مدلهای خودهمبسته، از سادهترین و پرکاربردترین مدلها در پردازش سیگنال و تحلیل سریهای زمانی هستند. در این مدل، مقدار سیگنال در هر نقطه، به صورت ترکیبی خطی از $$p$$ نقطه قبل در نظر گرفته میشود.
برای مثال، اگر سری $$X$$ را بهصورت زیر داشته باشیم:
$$ large x _ 1 , x _ 2 , dots , x _{n-1} , x _ n $$
یک مدل خودهمبسته از مرتبه $$p$$ بهصورت زیر تعریف میشود:
$$ large x_{t}=c+varphi_{1} x_{t-1}+varphi_{2} x_{t-2} +ldots+varphi_{p} x_{t-p}+varepsilon_{t}=c+sum_{i=1}^{p} varphi_{i} x_{t-i}+varepsilon_{t} $$
در این رابطه، بردار $$varphi$$ ضرایب مربوط به نقاط قبلی بوده و $$c$$ عددی ثابت است. مقدار $$varepsilon_{t}$$ نیز نشاندهنده اندک خطای مدل از مقادیر مشاهدهشده است که توزیع نرمال با میانگین صفر دارد.
برای یادگیری برنامهنویسی با زبان پایتون، پیشنهاد میکنیم به مجموعه آموزشهای مقدماتی تا پیشرفته پایتون فرادرس مراجعه کنید که لینک آن در ادامه آورده شده است.
برای مشاهده مجموعه آموزشهای برنامه نویسی پایتون (Python) — مقدماتی تا پیشرفته+ اینجا کلیک کنید.
پیاده سازی مدل خودهمبسته در پایتون
حال که با مدل خودهمبسته آشنا شدیم، وارد محیط برنامهنویسی شده و کتابخانههای مورد نیاز را برای پیادهسازی مدل خودهمبسته در پایتون فراخوانی میکنیم:
import numpy as np
import scipy.stats as stt
import sklearn.metrics as met
import matplotlib.pyplot as plt
import sklearn.linear_model as lm
import sklearn.model_selection as ms
این کتابخانهها بهترتیب برای موارد زیر کاربرد دارند:
کار با آرایهها و محاسبات برداری
محاسبه معیارهای آماری
محاسبه معیارهای ارزیابی مدل
رسم نمودار
ایجاد و آموزش مدلهای خطی
انتخاب مدل
حال میتوانیم Random State و Style را نیز تعیین کنیم:
np.random.seed(0)
plt.style.use('ggplot')
برای بررسی مدل، نیاز به یک مجموعه داده داریم. از یک دوره تناوب تابع سینوسی بهعنوان داده استفاده میکنیم:
T = np.linspace(0, 2*np.pi, num=100)
X = np.sin(T)
برای ایجاد مدل خودهمبسته، نیاز است تا از خودهمبستگی (Autocorrelation) سیگنال مطمئن شویم. اولین و سادهترین راه، رسم Scatter Plot سیگنال نسبت به Lagهای متفاوت است.
به این ترتیب، وجود ارتباطی خطی با Lag=1 تایید میشود.
با تکرار مراحل برای Lag=2 شکل زیر را خواهیم داشت.
به این ترتیب، پخششدگی بیشتر میشود، ولی همچنان رابطه خطی با Lag=2 مشهود است.
حال اگر Lag=50 را بررسی کنیم، شکل زیر را خواهیم داشت.
در این تصویر دو نکته به چشم میخورد:
ضریب همبستگی عکس حالات قبلی است.
تعداد نقاط کمتر است.
علت اتفاق اول، در ویژگی تابع سینوسی نهفته است. در یک تابع سینوسی، اگر دو نقطه بهصورت زیر داشته باشیم:
$$ large begin{aligned} &theta_{1}=alpha &theta_{2}=alpha+(2 k+1) pi end{aligned} $$
در این شرایط، این دو نقطه غیرهمفاز خواهند بود. در مجموعه داده ایجاد شده نیز فاصله یک دوره تناوب تقریباً به 100 بخش تقسیم شد که هر 50 نقطه معادل $$pi$$ خواهد بود، بنابراین، ارتباط با Lag=50 عکس خواهد بود.
علت اتفاق دوم نیز، از دست رفتن برخی دادهها بهدلیل نبودن Lag متناظر است. برای مثال، دادههای با شرایط $$t<50$$ در نمودار اخیر مشاهده نخواهد شد.
حال میتوانیم مشاهدات نمودارها را به شکل آماری بررسی کرد و در یک نمودار نمایش داد.
برای این کار ضریب همبستگی پیرسون (Pearson Correlation Coefficient) را نسبت به Lagهای مختلف محاسبه میکنیم.
ابتدا Lagهای مورد نیاز را انتخاب و یک آرایه خالی برای ذخیرهسازی مقادیر خودهمبستگی ایجاد میکنیم:
بنابراین، میتوان بهراحتی Lagهای مناسب را برای پیشبینی مشاهده کرد. توجه داشته باشید که مقدار همبستگی در Lag=0 برابر با 1 خواهد بود.
روش دیگر برای رسم نمودار خودهمبستگی، استفاده از تابع «plot_acf» موجود در کتابخانه «statsmodels» است.
حال که خودهمبستگی سیگنال اثبات شد، میتوان به تولید دادههای سری زمانی پرداخت. اگر یک مدل p=1 را در نظر بگیریم (پیشبینی تنها با توجه به یک نقطه قبلی)، مقدار سیگنال در Lag=1 بهعنوان ویژگی ورودی میتواند انتخاب شود و Lag=0 بهعنوان ویژگی هدف. برای مثال اگر سری بهصورت زیر باشد:
$$ large s_1,s_2, ldots ,s_{n-1},s_n $$
میتوان مجموعه داده را بهشکل زیر ایجاد کرد:
$$Y$$
$$X$$
$$s_2$$
$$s_1$$
$$s_3$$
$$s_2$$
…
…
$$s_n$$
$$s_{n-1}$$
به این ترتیب، اگر یک سیگنال با اندازه $$n$$ داشته باشیم، به تعداد $$n-p$$ داده خواهیم داشت.
برای پیادهسازی این بخش، یک تابع پیادهسازی میکنیم که در ورودی سری و $$p$$ را دریافت کرده و در خروجی مجموعه داده را برمیگرداند:
def CreateDataset(S:np.ndarray, nLag:int): return X, Y
حال در مرحله اول باید تعداد دادههای نهایی را تعیین کنیم. برای این کار ابتدا تعداد دادههای سیگنال را محاسبه میکنیم:
بنابراین، با افزایش نسبت نویز به سیگنال، دقت مدل در پیشبینی نیز کاهش مییابد.
افزایش nLag برای افزایش دقت در شرایطی که سیگنال رفتار پیچیدهای دارد کارآمد است، ولی در شرایطی که کم بودن دقت مدل ناشی از شدید بودن نویز باشد، افزایش nLag باعث Overfitting خواهد شد.
حال واریانس را به حالت قبلی برمیگردانیم و پارامترهای مدل را نمایش میدهیم:
در بین ضرایب، عدد بزرگتر مربوط به Lag=1 است که منطقی است. ولی در مورد $$varphi _2$$ این نکته قابل بیان نیست. براساس نمودار خودهمبستگی، باید هر دو ضریب اعداد بزرگ و نزدیکی به 1 باشند. علت این اختلاف، در Partial Autocorrelation نهفته است. خودهمبستگی به دست آمده برای Lag=2، اندکی نیز از Lag=1 اثر پذیرفته است، بنابراین با کم کردن این مقدار از دورههای قبلی، مقدار خالص خودهمبستگی به دست میآید. با توجه به این اعداد، میتوان حدس زد که تغییر nLag از 2 به 1، کاهش چندانی در دقت مدل ایجاد نخواهد کرد.
عدد ثابت به دست آمده نیز مقداری بسیار کوچک نبست به دامنه سیگنال است و میتوان آن را نیز در نظر نگرفت. برای این مورد میتوان به شکل زیر عمل کرد:
Model = lm.LinearRegression(fit_intercept=False)
حال پس از سادهسازیهای انجام شده، به دقت و پارامترهای زیر میرسیم:
از بین معیارهای محاسبه شده، NRMSE و MAPE و R2 بدون واحد (بُعد) هستند و به همین دلیل برای ارزیابی مدل مناسبتر هستند. برای مثال MAPE به سادگی بیان میکند که میانگین خطای نسبی 10% است.
برای دادههای آزمایش میتوان نمودار رگرسیون را نیز رسم کرد:
در انتها برای تحلیل نویز سفید ادعا شده، بردار خطا را محاسبه و نمودار هیستوگرام آن را رسم میکنیم:
Pall = Model.predict(x)
E = y - Pall
plt.hist(E, bins=9)
plt.xlabel('y(Actual) - y(Predicted)')
plt.ylabel('N')
plt.show()
و در خروجی به نمودار زیر میرسیم.
نمودار حاصل نسبتاً شبیه توزیع نرمال است. با افزایش دادهها از 100 به 500، وسیعتر کردن بازه زمانی از یک دوره به دو دوره و افزایش bins از 9 به 19، نمودار خطا به شکل زیر در میآید:
پیادهسازی مدل خودهمبسته در پایتون به این شکل انجام و به اتمام میرسد.
معرفی فیلم آموزش یادگیری ماشین Machine Learning با پایتون Python
فیلم آموزش یادگیری ماشین Machine Learning با پایتون Python در ۱۰ ساعت و در قالب ۹ درس ارائه شده است. عناوین درسهای این آموزش، عبارتاند از: مقدمهای در رابطه با یادگیری ماشین، آشنایی با بسته NumPy، آشنایی با بسته Pandas، ترسیم دادهها، آشنایی مقدماتی با مباحث آماری، پیشپردازش دادهها، یادگیری نظارتشده، یادگیری غیرنظارتشده و کاهش ابعاد.
جمعبندی
در این آموزش، پیادهسازی مدل خودهمبسته در پایتون را بررسی کردیم. برای مطالعه بیشتر، میتوان موارد زیر را بررسی کرد:
با کوچک کردن گام نمونهبرداری، پارامترها و دقت مدل چه تغییری میکند؟
با افزایش تعداد دوره از یک به دو و دو به سه، پارامترها و دقت مدل چه تغییری میکند؟
واریانس نمودار خطا چه ارتباطی با نویز اضافه شده به مجموعه داده دارد؟
با پیچیده کردن دادهها (برای مثال استفاده از مجموع دو تابع سینوسی)، چه تغیراتی باید در پارامترهای مدلسازی ایجاد کنیم؟
آیا نویز سفید موجود در سیگنال، قابل پیشبینی است؟ چه مقداری از این فرآیند تصادفی قابل پیشبینی است؟
اگر این مطلب برای شما مفید بوده است، آموزشها و مطالب زیر نیز به شما پیشنهاد میشوند:
«سید علی کلامی هریس»، دانشجوی سال چهارم داروسازی دانشگاه علوم پزشکی تهران است. او در سال 1397 از دبیرستان «پروفسور حسابی» تبریز فارغالتحصیل شد و هم اکنون در کنار تحصیل در حوزه داروسازی، به فعالیت در زمینه برنامهنویسی، یادگیری ماشین و تحلیل بازارهای مالی با استفاده از الگوریتمهای هوشمند میپردازد.