اذهب إلى المحتوى

مدخل إلى تعلم الآلة (Machine learning) في PHP


سارة محمد2

التصنيف باستخدام مكتبة PHP-ML

التصنيف في تعلم الآلة هو المشكلة التي تحدد مجموعة الفئات التي تنتمي إليها الملاحظة الجديدة، يندرج التصنيف تحت فئة تعلم الآلة المُشرَف عليه (Supervised Machine Learning)، تُعرَف أي خوارزمية تنفذ التصنيف بأنها مصنِّفة (classifier).

المصنِّفات المدعومة في PHP-ML هي:

  • SVC تصنيف دعم الشعاع (Support Vector Classification).
  • أقرب k جار (k-Nearest Neighbors).
  • مصنِّف بايز البسيط (Naive Bayes).

إنّ التوابع train وpredict هي نفسها لكل المصنِّفات (classifiers)، الفرق الوحيد في الخوارزمية الأساسية المستخدمة.

SVC تصنيف دعم الشعاع (Support Vector Classification)

نحتاج إلى تدريب المصنِّف قبل أن نبدأ بالتنبؤ بملاحظة جديدة، بفرض لدينا الشيفرة التالية:

// استيراد المكتبة
use Phpml\Classification\SVC; 
use Phpml\SupportVectorMachine\Kernel;

// بيانات تدريب المصنِّف
// عينات التدريب
$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$labels = ['a', 'a', 'a', 'b', 'b', 'b']; 

// تهيئة المصنِّف
$classifier = new SVC(Kernel::LINEAR, $cost = 1000);

// تدريب المصنِّف
$classifier->train($samples, $labels);

المتغير ‎$cost المُستخدم في الشيفرة السابقة هو مقياس لمقدار التصنيف الخاطئ الذي نريد تجنبه في كل مثال تدريبي، قد تحصل على أمثلة ذات تصنيف خاطئ من أجل قيم أقل للمتغير ‎$cost، يُضبَط افتراضيًا للقيمة 1.0.

يمكننا الآن البدء في بعض التنبؤات الحقيقية بعد أن أصبح لدينا المصنِّف مدرّبًا، بفرض لدينا الشيفرات التالية للتنبؤات:

$classifier->predict([3, 2]);
// 'b'

$classifier->predict([[3, 2], [1, 5]]);
// ['b', 'a']

يمكن أن يأخذ المصنِّف في هذه الحالة عينات غير مصنّفة ويتنبأ بتسمياتها، يمكن أن يأخذ التابع predict عينة مفردة أو مصفوفة من العينات.

أقرب k جار (k-Nearest Neighbors)

يأخذ المصنِّف في هذه الخوارزمية معاملَين ويمكن تهيئتهما كالتالي:

$classifier = new KNearestNeighbors($neighbor_num=4); 
$classifier = new KNearestNeighbors($neighbor_num=3, new Minkowski($lambda=4));

المتغير ‎$neighbor_num هو عدد الجيران الأقرب للفحص بخوارزمية ⁩knn، أما المعامل الثاني فهو مقياس المسافة والذي يكون افتراضيًا Euclidean في الحالة الأولى.

إليك مثال قصير عن كيفية استخدام المصنِّف:

// بيانات التدريب
$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]]; 
$labels = ['a', 'a', 'a', 'b', 'b', 'b']; 

// تهيئة المصنِّف
$classifier = new KNearestNeighbors();

// تدريب المصنِّف
$classifier->train($samples, $labels);

// التنبؤات
$classifier->predict([3, 2]);
// 'b'

$classifier->predict([[3, 2], [1, 5]]);
// ['b', 'a']

مصنِّف بايز البسيط (Naive Bayes)

يعتمد مصنِّف بايز البسيط على نظرية بايز ولا يحتاج أي معاملات في الباني، توضّح الشيفرة التالية تنفيذًا لتنبؤ بسيط:

// بيانات التدريب
$samples = [[5, 1, 1], [1, 5, 1], [1, 1, 5]];
$labels = ['a', 'b', 'c'];

// تهيئة المصنِّف
$classifier = new NaiveBayes();

// تدريب المصنِّف
$classifier->train($samples, $labels);

// التنبؤات
$classifier->predict([3, 1, 1]);
// 'a'

$classifier->predict([[3, 1, 1], [1, 4, 1]); 
// ['a', 'b']

حالة عمليّة

استخدمنا حتى الآن مصفوفات من الأعداد الصحيحة في كل الحالات ولكن هذه الحالة غير موجودة في حياتنا الواقعية، لذا سنحاول وصف حل عملي لكيفية استخدام المصنِّفات⁡.

بفرض لدينا تطبيق يخزّن خاصيّات الأزهار في الطبيعة، يمكننا أن نفرض للتبسيط لون الزهرة وطول البتلات ونستخدم هاتين الخاصيتين لتدريب البيانات، اللون هو الخاصيّة الأبسط إذ يمكننا إسناد قيمة صحيحة لكل لون ويمكن أن يكون عندك مجال للطول مثل ‎(0 mm,10 mm)=1‎، ‏‎(10 mm,20 mm)=2. درّب المصنِّف مع بيانات التهيئة، الآن إذا احتاج مستخدم ما لتحديد نوع الزهرة التي تنمو في حديقته الخلفية، عندها يختار لون الزهرة ويضيف طول البتلات ويُنفَّذ المصنِّف ويكشف نوع الزهرة.

الانحدار (Regression)

أسندنا باستخدام التصنيف مع مكتبة PHP-ML تسميات للملاحظة الجديدة، الانحدار هو نفسه تقريبًا إلا أنّ قيمة الخرج ليست اسم صنف بل قيمة مستمرة، يُستخدم بشكلٍ كبير للتنبؤات والتوقعات، تدعم مكتبة PHP-ML خوارزميات الانحدار التالية:

  • انحدار دعم المتجه (Support Vector Regression).
  • الانحدار الخطي ذو المربعات الأقل (Least Squares Linear Regression). يستخدم الانحدار نفس التوابع train وpredict المستخدمة في التصنيف.

انحدار دعم المتجه (Support Vector Regression)

هذه نسخة الانحدار من آلة دعم المتجه (‏SVM) (‏Support Vector Machine)، الخطوة الأولى مثل التصنيف هي تدريب النموذج:

// استيراد المكتبة
use Phpml\Regression\SVR;
use Phpml\SupportVectorMachine\Kernel;

// بيانات التدريب
$samples = [[60], [61], [62], [63], [65]];
$targets = [3.1, 3.6, 3.8, 4, 4.1];

// تهيئة محرك الانحدار
$regression = new SVR(Kernel::LINEAR);

// تدريب محرك الانحدار
$regression->train($samples, $targets); 

المتغير ‎$target في الانحدار ليس أسماء أصناف كما في التصنيف، هذا عامل للتفريق بين النوعين، يمكننا أن نبدأ بالتنبؤات الفعلية بعد تدريب نموذجنا.

$regression->predict([64])
// 4.03

لاحظ أنّ التنبؤات ترجع قيمة من خارج مجال الهدف.

الانحدار الخطي ذو المربعات الأقل (Least Squares Linear Regression)

تستخدم هذه الخوارزمية طريقة المربعات الأقل للوصول إلى حل تقريبي، إليك شيفرة بسيطة للتدريب والتنبؤ:

// بيانات التدريب
$samples = [[60], [61], [62], [63], [65]];
$targets = [3.1, 3.6, 3.8, 4, 4.1];

// تهيئة محرك الانحدار
$regression = new LeastSquares();

// تدريب محرك الانحدار
$regression->train($samples, $targets);

// التنبؤ باستخدام المحرك المدرَّب
$regression->predict([64]); 
// 4.06

توفر أيضًا مكتبة PHP-ML خيار Multiple Linear Regression، إليك الشيفرة التالية كمثال:

$samples = [[73676, 1996], [77006, 1998], [10565, 2000], [146088, 1995], [15000, 2001], [65940, 2000], [9300, 2000], [93739, 1996], [153260, 1994], [17764, 2002], [57000, 1998], [15000, 2000]]; $targets = [2000, 2750, 15500, 960, 4400, 8800, 7100, 2550, 1025, 5900, 4600, 4400];

$regression = new LeastSquares(); 
$regression->train($samples, $targets); 
$regression->predict([60000, 1996])
// 4094.82

يعدّ الخيار Multiple Linear Regression مفيدًا بشكلٍ خاص عندما يوجد عدة عوامل أو سمات لتحديد الخرج.

حالة عمليّة

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

العنقدة (Clustering)

العنقدة هي تجميع الكائنات المتشابهة معًا، وتستخدم بشكل واسع للتعرف على الأنماط، تعد العنقدة من نوع تعلم الآلة غير المُشرف عليه لذا لا توجد حاجة للتدريب، تدعم مكتبة PHP-ML خوارزميات العنقدة التالية:

  • k-Means
  • dbscan

خوارزمية k-Means

تفصل هذه الخوارزمية البيانات إلى n مجموعة بتباين متساوٍ، أي أننا نحتاج إلى تمرير الرقم n الذي هو عدد العناقيد التي نحتاجها في الحل، إليك الشيفرة التالية للتوضيح:

// مجموعة البيانات
$samples = [[1, 1], [8, 7], [1, 2], [7, 8], [2, 1], [8, 9]];

// ‫تهيئة العنقدة بالمعامل `n`
$kmeans = new KMeans(3);
$kmeans->cluster($samples);
// [0=>[[7, 8]], 1=>[[8, 7]], 2=>[[1,1]]]

لاحظ أنّ الخرج يحتوي 3 مصفوفات لأنّ هذه قيمة n في باني KMeans، يمكن أن يوجد معامل اختياري ثاني في الباني يصف طريقة التهيئة، مثال:

$kmeans = new KMeans(4, KMeans::INIT_RANDOM);

تحدد الطريقة INIT_RANDOM نقطة مركزية عشوائية أثناء محاولة تحديد العناقيد، تكون هذه النقطة محدودة بحدود فضاء البيانات لتجنب أن تكون هذه النقطة المركزية بعيدة جدًا عن البيانات. طريقة التهيئة الافتراضية للباني هي kmeans++‎ والتي تختار النقطة المركزية بطريقة ذكية لتسريع العملية.

خوارزمية DBSCAN

هي خوارزمية عنقدة تعتمد على الكثافة أي أننا لن نحتاج إلى تمرير n لتحديد عدد العناقيد التي نريدها في نتائجنا على عكس خوارزمية k-Means، إنما نحتاج إلى معاملين لتعمل:

  • ‎$minSamples: أقل عدد كائنات يجب أن تكون موجودة في العنقود.
  • ‎$epsilon: أقصى مسافة بين عينتين لنعدهما في نفس العنقود.

مثال:

// مجموعة بيانات العينة
$samples = [[1, 1], [8, 7], [1, 2], [7, 8], [2, 1], [8, 9]];

$dbscan = new DBSCAN($epsilon = 2, $minSamples = 3);
$dbscan->cluster($samples);
// [0=>[[1, 1]], 1=>[[8, 7]]]

لا توجد طريقة هنا لمعرفة عدد عناصر الخرج كما في خوارزمية k-Means.

حالة عمليّة

لنأخذ مثالًا عن تطبيق عملي في الحياة الواقعية، تستخدم العنقدة بشكلٍ كبير في التعرف على الأنماط والتنقيب عن البيانات، بفرض لديك تطبيق نشر محتوى، لتحافظ على المستخدمين يجب أن يظهر لديهم المحتوى الذي يحبونه، لنفرض للتبسيط أنهم إذا كانوا في صفحة ويب معينة لأكثر من دقيقة ونزلوا فيها إلى الأسفل أي أنهم أحبوا هذا المحتوى. الآن سيكون لكل محتوى معرف فريد وكذلك لكل مستخدم، ونجعل عنقودًا يعتمد على هذه الخصائص وستتعرف على شريحة المستخدمين التي تحب محتوى مشابه لهذا المحتوى، يمكن استخدام هذا في نظام التوصيات ⁢حيث يمكنك فرض أنّه إذا كان لدينا بعض المستخدمين في نفس العنقود أحبوا مقالة ما عندها فإنّ هذه المقالة ستظهر عند المستخدمين الباقيين في التوصيات.

ترجمة -وبتصرف- للفصل [Machine learning] من كتاب PHP Notes for Professionals book

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

بتاريخ 4 ساعات قال خديجة آل عوني:

جميل بس أبي أعرف كيف البداية 

مرحبًا خديجة،

يمكن الاطلاع على السلسلة من بدايتها من خلال العودة إلى أول مقال من السلسلة البدء مع PHP والتعرف على أنواع البيانات فيها . ولمواصلة الاطلاع على باقي المحتوى مقالًا بمقال، فيمكنك الضغط على "المقال التالي"، والذي ستجدينه بنهاية كلّ مقال، وإن أردتي العودة إلى المقال السابق لكل مقال، فيكفي الضغط على "المقال السابق".

كما يمكنك الاطلاع على المقال الذي تريدينه وليس بالضرورة من البداية من خلال الاطلاع على محتوى السلسة من هنا

وإن أردتي الاطلاع على المزيد فيما يخصّ الذكاء الاصطناعي وتعلم الآلة، فيُنصح بالاطلاع على هذه السلسة

رابط هذا التعليق
شارك على الشبكات الإجتماعية



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...