رگرسیون خطی

از ویکی‌کد، دانشنامهٔ برنامه‌نویسی
پرش به ناوبری پرش به جستجو
Main Page Tutorial
Python-menu.png
موارد آموزشی
مدیریت فایل
یادگیری ماشین
۱شروع کار
۲میانگین، میانه، مُد
۳انحراف استاندارد
۴صدک
۵توزیع داده
۶توزیع داده نرمال
۷نمودار پراکندگی
۸رگرسیون خطی
۹رگرسیون چند جمله‌ای
۱۰رگرسیون چندگانه
۱۱مقیاس
۱۲آموزش / تست
۱۳درخت تصمیم
MySQL در پایتون
MongoDB در پایتون
مرجع پایتون
مرجع ماژول
چگونه در پایتون؟
مثال‌های پایتون

رگرسیون

عبارت رگرسیون هنگامی استفاده می‌شود که بخواهیم رابطه بین متغیرها را بیابیم.[۱]

در یادگیری ماشین، و در مدلسازی آماری، این رابطه برای پیش بینی نتیجه رویدادهای آینده استفاده می‌شود.

رگرسیون خطی

رگرسیون خطی از رابطه بین نقاط داده برای رسم یک خط صاف بین همهٔ آنها استفاده می‌کند.

این خط برای پیش بینی آینده استفاده می‌شود.

در یادگیری ماشین، پیش بینی آینده بسیار مهم است.

چگونه کار می کند؟

پایتون متدهایی برای یافتن رابطه بین نقاط داده و ترسیم خط رگرسیون خطی دارد. ما به شما نشان خواهیم داد که چگونه می‌توانید از این متدها به جای فرمول ریاضی استفاده کنید.

در مثال زیر، محور x سن، و محور y سرعت را نشان می‌دهد. ما سن و سرعت ۱۳ اتومبیل را هنگام گذشتن از گیشه دریافت عوارض ثبت کرده‌ایم. می‌خواهیم ببینیم از داده‌های جمع آوری شده می‌توان در یک رگرسیون خطی استفاده کرد یا نه:

مثال

با رسم نمودار پراکندگی آغاز می‌کنیم:

1 import matplotlib.pyplot as plt
2 
3 x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
4 y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
5 
6 plt.scatter(x, y)
7 plt.show()

نتیجه


مشاهدهٔ نتیجه


مثال

scipy را Import کرده و خط رگرسیون خطی را رسم می‌کنیم:

 1 import matplotlib.pyplot as plt
 2 from scipy import stats
 3 
 4 x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
 5 y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
 6 
 7 slope, intercept, r, p, std_err = stats.linregress(x, y)
 8 
 9 def myfunc(x):
10   return slope * x + intercept
11 
12 mymodel = list(map(myfunc, x))
13 
14 plt.scatter(x, y)
15 plt.plot(x, mymodel)
16 plt.show()

نتیجه


مشاهدهٔ نتیجه


توضیح مثال

ماژول‌های مورد نیاز را Import می‌کند:

1 import matplotlib.pyplot as plt
2 from scipy import stats

آرایه‌هایی که نشان دهندهٔ مقدار محورهای x و y هستند را ایجاد می‌کند:

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

متدی را اجرا می‌کند که برخی از مقدارهای کلیدی مهم رگرسیون خطی را برمی‌گرداند:

slope, intercept, r, p, std_err = stats.linregress(x, y)

تابعی ایجاد می‌کند که از مقدارهای slope و intercept برای برگرداندن مقدار جدید استفاده می‌کند. این مقدار جدید نشان دهندهٔ مکانی در که محور y است که مقدار x متناظر قرار خواهد گرفت:

1 def myfunc(x):
2   return slope * x + intercept

هر مقدار آرایه x را در تابع اجرا می‌کند. این کار منجر به آرایه ای با مقادیر جدید برای محور y می‌شود:

mymodel = list(map(myfunc, x))

نمودار پراکندگی اصلی راطراحی می‌کند:

plt.scatter(x, y)

خط رگرسیون خطی را رسم می‌کند:

plt.plot(x, mymodel)

نمودار را نمایش می‌دهد:

plt.show()

R-Squared

مهم است که بدانیم رابطه بین مقادیر محور x و مقادیر محور y چقدر خوب است، در صورت عدم وجود رابطه، از رگرسیون خطی نمی‌توان برای پیش بینی هیچ چیزی استفاده کرد.

این رابطه با مقداری به نام r-squared محاسبه می‌شود.

مقدار r-squared از ۰ تا ۱ است که ۰ یعنی هیچ رابطه ای وجود ندارد و ۱ یعنی ۱۰۰٪ بهم مرتبط‌اند.

پایتون و ماژول Scipy این مقدار را برای شما محاسبه می‌کنند، تنها کاری که لازم است بکنید دادن مقدارهای x و y به آن است:

مثال

داده‌های من چقدر خوب در یک رگرسیون خطی جای می‌گیرند؟

1 from scipy import stats
2 
3 x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
4 y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
5 
6 slope, intercept, r, p, std_err = stats.linregress(x, y)
7 
8 print(r)


مشاهدهٔ نتیجه


توجه: نتیجه -۰۷۶ نشان می‌دهد که یک رابطه وجود دارد، کامل نیست اما نشان می‌دهد که می‌توانیم از رگرسیون خطی برای پیش بینی‌های آینده استفاده کنیم.

پیش بینی مقدارهای آینده

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

مثال: می‌خواهیم سرعت یک ماشین ۱۰ ساله را پیش بینی کنیم.

برای این کار، به تابع myfunc() مشابه مثال بالا نیاز داریم

1 def myfunc(x):
2   return slope * x + intercept

مثال

سرعت یک ماشین ۱۰ ساله را پیش بینی می‌کند:

 1 from scipy import stats
 2 
 3 x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
 4 y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
 5 
 6 slope, intercept, r, p, std_err = stats.linregress(x, y)
 7 
 8 def myfunc(x):
 9   return slope * x + intercept
10 
11 speed = myfunc(10)
12 
13 print(speed)


مشاهدهٔ نتیجه


این مثال سرعت را ۸۵٫۶ پیش بینی می‌کند که می‌توانیم از روی نمودار هم بخوانیم:

سازگاری بد؟

می‌خواهیم مثالی تعریف کنیم که رگرسیون خطی بهترین متد برای پیش بینی مقدارهای آینده نیست.

مثال

این مقدارها برای محورهای x و y باید منجر به سازگاری بد با رگرسیون خطی شوند:

 1 import matplotlib.pyplot as plt
 2 from scipy import stats
 3 
 4 x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
 5 y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
 6 
 7 slope, intercept, r, p, std_err = stats.linregress(x, y)
 8 
 9 def myfunc(x):
10   return slope * x + intercept
11 
12 mymodel = list(map(myfunc, x))
13 
14 plt.scatter(x, y)
15 plt.plot(x, mymodel)
16 plt.show()

نتیجه


مشاهدهٔ نتیجه


و مقدار r-squared؟

مثال

باید یک مقدار r-squared خیلی پایین به دست آورید.

1 import numpy
2 from scipy import stats
3 
4 x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
5 y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
6 
7 slope, intercept, r, p, std_err = stats.linregress(x, y)
8 
9 print(r)


مشاهدهٔ نتیجه


نتیجه: ۰٫۰۱۳ نشان دهنده یک رابطه خیلی بد است و به ما می‌گوید که این داده‌ها برای رگرسیون خطی مناسب نیستند.


منابع آموزشی