هذه الصفحة تبني على المتجهات والمصفوفات وتدخل في عمليات الجبر الخطي الأساسية. لن نشرح براهين ولا نتعمّق أكاديميًا — فقط ما تحتاجه لفهم ما يدور داخل النماذج.
ضرب المصفوفات (Matrix Multiplication)
هذه العملية الأساسية التي تنبثق منها التنبؤات في كل نموذج تعلّم آلي تقريبًا.
القاعدة
(A @ B) ممكن فقط إذا:
عدد أعمدة A = عدد صفوف B
النتيجة: مصفوفة الشكل (صفوف A, أعمدة B)
مثال عملي
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]]) # شكل (2, 3)
B = np.array([[7, 8],
[9, 10],
[11, 12]]) # شكل (3, 2)
C = A @ B # شكل (2, 2)
print(C)
# [[ 58 64]
# [139 154]]
لماذا هذه العملية مهمة في AI؟
كل تنبؤ في الشبكة العصبية هو ضرب مصفوفات:
# مثال: طبقة Fully Connected بسيطة
batch_size = 32
input_features = 784 # مثل صورة 28×28
hidden_units = 128
X = np.random.random((batch_size, input_features)) # (32, 784)
W = np.random.random((input_features, hidden_units)) # (784, 128)
# الضربة الواحدة: X @ W تعطي تمثيلات الطبقة المخفية
H = X @ W # شكل (32, 128) — 32 مثالًا، 128 ميزة مستخرجة
حاصل الضرب النقطي (Dot Product)
حاصل ضرب نقطي بين متجهين = عدد واحد:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
dot = a @ b # 1*4 + 2*5 + 3*6 = 32
print(dot) # 32
يُستخدم كثيرًا لقياس التشابه: متجهان متشابهان اتجاهيًا → حاصل ضربهما كبير.
المحدد (Determinant)
رقم واحد يصف خصائص المصفوفة المربّعة. في تعلّم الآلة العملي، قلّما تحسبه يدويًا — NumPy يحسبه في سطر:
A = np.array([[1, 2],
[3, 4]])
det = np.linalg.det(A)
print(det) # -2.0
لماذا يهمّ؟
- المحدد ≠ 0 → المصفوفة قابلة للعكس (لها inverse).
- المحدد = 0 → المصفوفة مفردة (singular) → لا يمكن عكسها.
المصفوفة المعكوسة (Inverse)
إذا ضربنا مصفوفة في معكوسها، نحصل على مصفوفة الوحدة:
A = np.array([[1, 2],
[3, 4]])
A_inv = np.linalg.inv(A)
print(A @ A_inv)
# [[1. 0.]
# [0. 1.]]
ملاحظة عملية: حساب المعكوس مكلف حسابيًا وغير مستقر عدديًا للمصفوفات الكبيرة. لذلك في ML الحقيقي نادرًا ما نحسب inv(A)، بل نحل أنظمة المعادلات بطريقة مختلفة (مثل np.linalg.solve).
حل أنظمة المعادلات الخطية
في Linear Regression الكلاسيكي، الحل المغلق (Normal Equation) يحل المعادلة X β = y كالتالي:
import numpy as np
# بيانات: ميزات X وهدف y
X = np.array([[1, 1],
[1, 2],
[1, 3],
[1, 4]]) # عمود 1 = intercept
y = np.array([2, 4, 5, 4])
# الحل المغلق: β = (X^T X)^{-1} X^T y
beta = np.linalg.solve(X.T @ X, X.T @ y)
print(beta)
# [2.0, 0.7] → intercept ≈ 2.0، الميل ≈ 0.7
في NumPy: استخدم np.linalg.solve(A, b) بدلاً من np.linalg.inv(A) @ b — أسرع وأكثر استقرارًا عدديًا.
الرتبة (Rank) والمصفوفات المفردة
- رتبة المصفوفة = عدد الصفوف (أو الأعمدة) المستقلة خطيًا.
- إذا كانت الرتبة أقلّ من عدد الصفوف/الأعمدة → المصفوفة مفردة → غير قابلة للعكس.
A = np.array([[1, 2, 3],
[2, 4, 6], # هذا الصف = 2 × الصف الأول
[1, 1, 1]])
print(np.linalg.matrix_rank(A)) # 2 — لأن صفًا مكرّرًا
في تعلّم الآلة: multicollinearity (ميزات مترابطة جدًا) يجعل مصفوفة X^T X قريبة من المفردة → الحل يصبح غير مستقر. أحد أسباب استخدام Regularization (Ridge / Lasso).
القيم الذاتية والمتجهات الذاتية (Eigenvalues / Eigenvectors) — لمحة
هذا موضوع متقدّم لكنه يظهر في PCA، وهو خوارزمية تقليل الأبعاد:
A = np.array([[2, 0],
[0, 3]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print("القيم الذاتية:", eigenvalues)
print("المتجهات الذاتية:")
print(eigenvectors)
فكرة بدون رياضيات ثقيلة: القيم الذاتية تخبرك في أي اتجاه تتغير البيانات أكثر. PCA يستخدم أكبر القيم الذاتية لاختيار أكثر الاتجاهات أهمية — وبهذا يقلل عدد الأبعاد.
كيف يستخدم ML الجبر الخطي عمليًا؟
| خوارزمية | استخدام الجبر الخطي |
|---|---|
| Linear Regression | ضرب المصفوفات + حل أنظمة معادلات |
| Logistic Regression | ضرب المصفوفات + Gradient Descent |
| PCA | القيم الذاتية + المتجهات الذاتية |
| Neural Networks | ضرب المصفوفات في كل طبقة |
| Embeddings | ضرب المتجهات لحساب التشابه |
| Word2Vec | ضرب متجهات الكلمة بالسياق |
أخطاء شائعة
- حساب المعكوس بدل
solve: عند حلA x = b، استخدمnp.linalg.solve(A, b)بدلnp.linalg.inv(A) @ b— أسرع وأدقّ. - أشكال خاطئة: تذكّر
(m, k) @ (k, n)فقط — ليس أي ترتيب. - اعتبار الرتبة مجرد رقم: في الواقع، الرتبة المنخفضة = إشارة لمشكلة في البيانات (multicollinearity).
- حساب eigen للمصفوفات الكبيرة جدًا: O(n³) — لا تستخدمه على بيانات ضخمة.
الخطوات التالية
- الاحتمالات — التعامل مع عدم اليقين في التنبؤات.
- الإحصاء — تقييم النماذج وفهم البيانات.
- المتجهات والمصفوفات — الأساس الذي بنيت عليه هذه الصفحة.
- NumPy للذكاء الاصطناعي — كيف تنفّذ كل هذه العمليات في بايثون.