跳至内容
صيغ الانحدار الخطي البسيط والمتعدد والتنفيذ من الصفر

صيغ الانحدار الخطي البسيط والمتعدد والتنفيذ من الصفر

2020-03-21 15:51

الصيغ نفسها قصيرة جدًا، وهي الدرس الأول في ESL، وأساسية للغاية.

هناك العديد من المكتبات التي يمكنها القيام بهذا الأمر، ولكن بما أنني كنت بحاجة مؤخرًا في عملي إلى حساب الانحدار باستخدام وحدة معالجة الرسومات (GPU) (مما يمكن أن يسرع العملية مرات عديدة)، فسأكتب مدونة لاختبار ما إذا كان عرض الصيغ على الموقع يعمل بشكل صحيح.

ما هو الانحدار الخطي

ببساطة، هو استخدام معادلة خطية لتمثيل اتجاه البيانات.

أحادي المتغير: $y=mx+b$ متعدد المتغيرات: $y=m_1x_1+m_2x_2+…+b$

|1.5x يمكنك تخيل أن كل نقطة هي نجم له نفس الكتلة، وخط الانحدار هو عصا طويلة توضع في هذا البيان الجاذبي حتى تصل إلى موضع التوازن النهائي.

صيغة الانحدار الخطي البسيط أحادي المتغير (Linear regression)

تم إدراج Simple OLS regression بشكل منفصل لأنها أكثر بداهة وسهولة في الفهم:

m=σx,yσx2=E[(Xμ)(Yν)]E[(Xμ)2]m=\frac {\sigma_{x, y}} {\sigma^2_x}=\frac {E[(X-\mu)(Y-\nu)]} { E[(X-\mu)^2] }

إنه ببساطة التباين المشترك مقسومًا على تباين x. سنتجاوز كيفية اشتقاق هذه الصيغة، لكن يجب أن تكون قد شعرت بسحر هذه الصيغة.

ثم يمكن إيجاد b بمجرد الحصول على m عن طريق التعويض:

b=yˉmxˉb=\bar{y} - m\bar{x}

التنفيذ باستخدام كود pyTorch

يتم استخدام pyTorch لتسريع وحدة معالجة الرسومات. لنفترض الآن أن لدينا بيانات y تمثل أسعار NVDA لشهر فبراير 2018:

import torch
y = torch.tensor([
    225.58, 228.8 , 217.52, 230.93, 228.03, 232.63, 241.42, 246.5 ,
    243.84, 249.08, 241.51, 242.15, 245.93, 246.58, 246.06, 242.  ,
    232.21, 236.54, 235.65, 242.16
])

ثم نقوم بإنشاء x:

x = torch.arange(len(y)).float()

tensor([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15., 16., 17., 18., 19.])

كود الانحدار (هنا فقط من أجل قابلية القراءة، هناك حسابات متكررة):

demean_x = x - x.mean()
demean_y = y - y.mean()
n_1 = x.shape[0] - 1
m = torch.sum(demean_x * demean_y / n_1) / torch.sum(demean_x ** 2 / n_1)
b = y.mean() - m * x.mean()
print(m, b)

(tensor(0.7734), tensor(230.4090))

لنرسم بيانيًا لنرى النتيجة:

from matplotlib import pyplot as plt
plt.plot(x, y)
plt.plot(x, m * x + b)
plt.show()

|1.5x يبدو جيدًا🥂.

صيغة الانحدار الخطي المتعدد (Multiple Linear regression)

الجوهر هو نفسه الانحدار البسيط، هنا نستخدم التعبير المصفوفي، وهو أكثر إيجازًا:

b,m1,...,mn=(XTX)1XTy b,m_1,...,m_n=(X^TX)^{-1}X^Ty

صيغة واحدة تحل كل شيء، وهي تنطبق أيضًا على الانحدار الخطي البسيط.

على هامش الحديث، $X^TX$ تظهر في كل مكان، وهناك حتى صندوق تحوط خاص اسمه XTX.

التنفيذ باستخدام كود pyTorch

تحتوي الصيغة على الكثير من المعلومات المخفية، بينما يكون الشرح النصي مطولًا جدًا، دعونا ننفذها باستخدام الكود.

لطالما اعتقدت أنه إذا كانت الصيغ في الكتب المدرسية والأوراق البحثية مصحوبة بكود مطابق ونتائج تشغيل لكل خطوة، لكانت هناك أسئلة أقل عند القراءة، لأن جعل الكود قابلًا للتنفيذ يتطلب معلومات كاملة.

هنا نستخدم الانحدار الخطي الثنائي للتوضيح، والأكثر شيوعًا هو استخدام معادلة تربيعية أحادية المتغير ($y=ax^2+bx+c$)، أي تركيب منحنى. إذا كانت معادلة أحادية المتغير، فلماذا انحدار ثنائي؟ لأن الثنائية في الانحدار تشير إلى وجود متغيرين مستقلين: $x, x^2$

لا نزال نستخدم بيانات x, y السابقة، أولاً لننشئ مصفوفة X، التي تحتوي على $x, x^2$، ولكن يجب ملاحظة أن العمود الأول هنا يحتوي على ثابت 1، لضمان أن المصفوفة موجبة محددة ولإيجاد b (المشار إليه في الصورة بـ ${\hat\beta}_0$):

X = torch.stack([torch.ones(x.shape), x, x ** 2]).T

tensor([[ 1., 0., 0.], [ 1., 1., 1.], [ 1., 2., 4.], [ 1., 3., 9.], [ 1., 4., 16.], [ 1., 5., 25.], … [ 1., 15., 225.], [ 1., 16., 256.], [ 1., 17., 289.], [ 1., 18., 324.], [ 1., 19., 361.]])

ثم يمكن إجراء العمليات الحسابية مباشرة:

b, m1, m2 = (X.T @ X).inverse() @ X.T @ y
print(b, m1, m2)

(tensor(220.5210), tensor(4.0694), tensor(-0.1735))

نعم، هذه هي النتيجة، دعونا نرسمها لنرى:

plt.plot(x, y)
plt.plot(x, m1 * x + m2 * x**2 + b)
plt.show()

|1.5x

ممتاز تمامًا👏، أليس الأمر بسيطًا؟ ولكن في الواقع هناك مفاهيم أكثر أهمية فيما بعد، مثل حالات الحلول المتعددة والمعالجة المتعامدة.

مشكلة التعددية الخطية والتعامد

في التطبيق العملي، المشكلات التي يمكن حلها ببساطة عن طريق الانحدار متعدد الحدود ليست شائعة، فعادة ما يتعلق الأمر بالانحدار على القيم المرصودة، والقيم المرصودة غالبًا لا تكون مستقلة تمامًا، أي أن التباين المشترك بين قيم x لا يساوي الصفر. الحفاظ على استقلالية قيم x يضمن أن المعامل (coefficient) يتحمل مسؤولية ذلك x فقط دون تأثره بقيم x الأخرى، وهذا يتطلب ضبطًا متعامدًا.

لن نخوض في التفاصيل، إذا كنت تريد حل المشكلة بسرعة، إليك الحل التقريبي: استخدام تحلل QR. احسب باستخدام Q, R = torch.qr(X) ثم استخدم الصيغة $b, m_1,…,m_n=R^{-1}Q^Ty$ للحل.

إذا كنت مهتمًا، يمكنك الاطلاع على ESL 3.2.3 Multiple Regression from Simple Univariate Regression، الذي يستخدم الانحدار الأحادي للوصول إلى الانحدار المتعدد.

المؤلف: Zhang Jianhao Heerozh (heerozh.com)

آخر تعديل
hugo-builder
hugo-builder · · 自动翻译 about.md 2... · 248520b
مساهمون آخرون
...