ML Learning Hub
الأسسمبتدئ

مكدس Python للتعلم الآلي: NumPy وPandas وMatplotlib

مجموعة أدوات علوم البيانات — NumPy وPandas وMatplotlib وسير عمل Jupyter

أتقن الأدوات التي يستخدمها كل مهندس تعلم آلي يومياً — عمليات NumPy المتجهة وPandas DataFrames وMatplotlib/Seaborn للتصور البصري. الأساس الذي يبني عليه كل شيء آخر.

35 min
6 مخططات
7 المفاهيم المغطاة

المفاهيم المغطاة

NumPy ArraysBroadcastingPandas DataFrameEDAMatplotlibSeabornVectorization

الصيغ الرئيسية

المتوسط المتجّه

np.mean(X) — تحسب NumPy هذا بلغة C، أسرع بمراتب من حلقة Python

البث

تمدد NumPy المصفوفة الصغيرة على البُعد الناقص — تتجنب الحلقات الصريحة

ارتباط بيرسون

np.corrcoef(X,Y) — يقيس الاعتماد الخطي بين ميزتين

محاكاة تفاعلية

Loading visualization…
🎯

لماذا هذه الأدوات قبل كل شيء

motivation

كل إطار عمل للتعلم الآلي — scikit-learn وPyTorch وTensorFlow وJAX — يعتمد على مصفوفات NumPy. فهم كيفية عمل المصفوفات في الذاكرة هو الفرق بين كتابة حلقات Python بتعقيد O(n²) وعمليات NumPy المتجهة بتعقيد O(n) التي تعمل بسرعة لغة C. يمنحك Pandas إطارات البيانات للبيانات الفوضوية الحقيقية، وتتيح لك Matplotlib/Seaborn رؤية ما يحدث قبل النمذجة. النظام البيئي بأكمله يتحدث NumPy — إتقانه يعني إتقان اللغة المشتركة.

حلقة Python على 10 ملايين رقم تستغرق ~4 ثوانٍ. np.sum() تستغرق ~8ms — أسرع 500 مرة. هذا يهم عند حساب التدرجات في شبكة عصبية.

⚙️

أساسيات NumPy — ما تحتاجه فعلاً

algorithm
1

إنشاء المصفوفات: np.array(), np.zeros(), np.ones(), np.linspace(), np.arange(), np.random.randn()

2

معالجة الأشكال: .reshape(), .T (نقل)، np.concatenate()، np.stack()، np.squeeze()

3

العمليات الرياضية المتجهة: +، -، *، / تعمل عنصراً بعنصر؛ np.dot() / @ لضرب المصفوفات

4

الفهرسة: arr[2:5]، arr[arr > 0] (قناع منطقي)، arr[:, 0] (شريحة عمود)

5

التجميعات: .sum()، .mean()، .std()، .max()، .argmax() — تقبل جميعها معامل axis=

6

قاعدة البث: محاذاة الأشكال من اليمين، يجب تطابق الأبعاد أو أن تكون 1

</>

NumPy, Pandas & Matplotlib — سير العمل الكامل

code
python71 lines
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

class="tok-comment"># ── NumPy: arrays, broadcasting, vectorized ops ───────────────────────────────
X = np.random.randn(class="tok-num">1000, class="tok-num">5)          class="tok-comment"># class="tok-num">1000 samples, class="tok-num">5 features
y = class="tok-num">2*X[:,class="tok-num">0] - X[:,class="tok-num">1] + class="tok-num">0.5*np.random.randn(class="tok-num">1000)

print(X.shape, X.dtype)               class="tok-comment"># (class="tok-num">1000, class="tok-num">5) float64
print(X.mean(axis=class="tok-num">0).round(class="tok-num">3))        class="tok-comment"># per-feature means ≈ class="tok-num">0
print(X.std(axis=class="tok-num">0).round(class="tok-num">3))         class="tok-comment"># per-feature stds ≈ class="tok-num">1

class="tok-comment"># Broadcasting: subtract mean and divide by std (manual StandardScaler)
X_scaled = (X - X.mean(axis=class="tok-num">0)) / X.std(axis=class="tok-num">0)

class="tok-comment"># Matrix multiply: X @ W where W is class="tok-num">5×class="tok-num">2
W = np.random.randn(class="tok-num">5, class="tok-num">2)
Z = X_scaled @ W                       class="tok-comment"># shape (class="tok-num">1000, class="tok-num">2)

class="tok-comment"># Boolean indexing
high_income = X[X[:,class="tok-num">0] > class="tok-num">1.0]         class="tok-comment"># rows where feature class="tok-num">0 > class="tok-num">1σ
print(fclass="tok-str">"High income rows: {len(high_income)}")

class="tok-comment"># ── Pandas: DataFrames, EDA ───────────────────────────────────────────────────
df = pd.DataFrame(X, columns=[fclass="tok-str">"feat_{i}" for i in range(class="tok-num">5)])
df[class="tok-str">"target"] = y

class="tok-comment"># Quick EDA
print(df.describe().round(class="tok-num">2))          class="tok-comment"># count, mean, std, quartiles
print(df.isnull().sum())               class="tok-comment"># check for missing values
print(df.dtypes)

class="tok-comment"># Groupby example
df[class="tok-str">"group"] = np.where(df[class="tok-str">"feat_0"] > class="tok-num">0, class="tok-str">"high", class="tok-str">"low")
print(df.groupby(class="tok-str">"group")[class="tok-str">"target"].agg([class="tok-str">"mean",class="tok-str">"std"]).round(class="tok-num">3))

class="tok-comment"># Correlations
corr = df.drop(columns=class="tok-str">"group").corr()
print(corr[class="tok-str">"target"].sort_values(ascending=False).round(class="tok-num">3))

class="tok-comment"># ── Matplotlib / Seaborn: visualization ──────────────────────────────────────
fig, axes = plt.subplots(class="tok-num">1, class="tok-num">3, figsize=(class="tok-num">15, class="tok-num">4))

class="tok-comment"># class="tok-num">1. Distribution plot
axes[class="tok-num">0].hist(df[class="tok-str">"target"], bins=class="tok-num">50, color=class="tok-str">"class="tok-comment">#6c63ff", alpha=class="tok-num">0.8, edgecolor=class="tok-str">"white")
axes[class="tok-num">0].set_title(class="tok-str">"Target distribution")
axes[class="tok-num">0].set_xlabel(class="tok-str">"y")

class="tok-comment"># class="tok-num">2. Scatter + regression line
axes[class="tok-num">1].scatter(df[class="tok-str">"feat_0"], df[class="tok-str">"target"], alpha=class="tok-num">0.3, s=class="tok-num">10, color=class="tok-str">"class="tok-comment">#06b6d4")
m, b = np.polyfit(df[class="tok-str">"feat_0"], df[class="tok-str">"target"], class="tok-num">1)
x_line = np.linspace(-class="tok-num">3, class="tok-num">3, class="tok-num">100)
axes[class="tok-num">1].plot(x_line, m*x_line + b, color=class="tok-str">"class="tok-comment">#ff6b6b", lw=class="tok-num">2, label=fclass="tok-str">"slope={m:.2f}")
axes[class="tok-num">1].set_title(class="tok-str">"Feature class="tok-num">0 vs Target")
axes[class="tok-num">1].legend()

class="tok-comment"># class="tok-num">3. Correlation heatmap
sns.heatmap(corr, annot=True, fmt=class="tok-str">".2f", cmap=class="tok-str">"coolwarm",
            center=class="tok-num">0, ax=axes[class="tok-num">2], cbar=False)
axes[class="tok-num">2].set_title(class="tok-str">"Correlation matrix")

plt.tight_layout()
plt.show()

class="tok-comment"># ── Jupyter tips ──────────────────────────────────────────────────────────────
class="tok-comment"># %timeit np.dot(X, W)       # benchmark any cell
class="tok-comment"># %matplotlib inline          # show plots in notebook
class="tok-comment"># df.head()                   # preview first class="tok-num">5 rows
class="tok-comment"># df.info()                   # dtypes + non-null counts
class="tok-comment"># pd.set_option(class="tok-str">'display.max_columns', None)  # show all columns
⚠️

أكثر أخطاء NumPy شيوعاً

pitfall

1) عدم تطابق الأشكال: (100,) ≠ (100,1). تحقق دائماً من .shape قبل عمليات المصفوفة. 2) القسمة الصحيحة: انتبه مع مصفوفات dtype=int. 3) النسخ مقابل العروض: arr[0:5] تُعيد عرضاً — تعديله يُعدّل الأصل. استخدم .copy() للأمان. 4) في المكان مقابل خارجه: X *= 2 تُعدّل X في مكانها؛ Y = X * 2 تُنشئ مصفوفة جديدة. 5) انتشار NaN: np.mean([1,2,np.nan]) = NaN. استخدم np.nanmean() للتجميعات الآمنة.

np.shares_memory(a, b) يخبرك إذا كانت مصفوفتان تشتركان في البيانات الأساسية — معلومة حيوية عند 'نسخ' الشرائح.

?اختبار المعرفة

يتم حفظ التقدم في متصفحك — لا حاجة لحساب.

تحتاج مهندس ذكاء اصطناعي أو عالم بيانات؟

أبني نماذج تعلم آلي مخصصة، ووكلاء ذكاء اصطناعي، ورؤية حاسوب، وأتمتة — من الفكرة إلى الإنتاج.