مقدمة
بالمقارنة مع اللغات الأخرى مفتوحة المصدر مثل Perl وPython، يفتقر مجتمع PHP إلى جهد قوي لتطوير مكتبات الرياضيات.
قد يكون أحد أسباب ذلك هو وجود عدد كبير بالفعل من الأدوات الرياضية الناضجة، مما قد يعيق جهود المجتمع لتطوير أدوات PHP بمفردها. على سبيل المثال، عملت على أداة قوية، وهي نظام S، الذي كان يضم مجموعة رائعة من المكتبات الإحصائية، وكان مصممًا خصيصًا لتحليل مجموعات البيانات، وفاز بجائزة ACM في عام 1998 عن تصميمه اللغوي. إذا كان S أو ابن عمه مفتوح المصدر R مجرد استدعاء exec_shell، فلماذا نواجه مشكلة تنفيذ نفس وظيفة الحوسبة الإحصائية في PHP؟ لمزيد من المعلومات حول نظام S، أو جائزة ACM، أو R، راجع المراجع ذات الصلة.
أليس هذا مضيعة لطاقة المطورين؟ إذا كان الدافع لتطوير مكتبة PHP للرياضيات هو توفير جهد المطور واستخدام أفضل أداة للمهمة، فإن موضوع PHP الحالي منطقي.
من ناحية أخرى، قد تشجع الدوافع التربوية على تطوير مكتبات الرياضيات PHP. تعتبر الرياضيات موضوعًا مثيرًا للاهتمام يستحق الاستكشاف بالنسبة لحوالي 10% من الأشخاص. بالنسبة لأولئك الذين يتقنون PHP أيضًا، فإن تطوير مكتبة PHP للرياضيات يمكن أن يعزز عملية تعلم الرياضيات. وبعبارة أخرى، لا تقرأ الفصل الخاص باختبارات T فحسب، بل قم أيضًا بتنفيذ برنامج يمكنه حساب المتوسط المقابل القيم وعرضها بتنسيق قياسي لفئاتها.
من خلال التوجيه والتدريب، آمل أن أثبت أن تطوير مكتبة PHP للرياضيات ليست مهمة صعبة وقد تمثل تحديًا تقنيًا وتعليميًا مثيرًا للاهتمام. في هذه المقالة، سأقدم مثالًا لمكتبة PHP الرياضية، والتي تسمى SimpleLinearRegression، والتي توضح النهج العام الذي يمكن استخدامه لتطوير مكتبات PHP الرياضية. لنبدأ بمناقشة بعض المبادئ العامة التي أرشدتني في تطوير فئة SimpleLinearRegression.
المبادئ التوجيهية
لقد استخدمت ستة مبادئ عامة لتوجيه تطوير فئة SimpleLinearRegression.
إنشاء فئة لكل نموذج التحليل.
استخدم الارتباط العكسي لتطوير الفصول الدراسية.
ومن المتوقع وجود عدد كبير من الحاصلين على.
تخزين النتائج المتوسطة.
قم بتعيين التفضيلات لواجهات برمجة التطبيقات التفصيلية.
الكمال ليس هو الهدف .
دعونا نفحص كل من هذه الإرشادات بمزيد من التفصيل.
قم بإنشاء فئة لكل نموذج تحليل.
يجب أن يحتوي كل اختبار أو عملية تحليل رئيسية على فئة PHP بنفس اسم الاختبار أو العملية. تحتوي هذه الفئة على وظائف الإدخال ووظائف حساب القيم المتوسطة وقيم الملخص ووظائف الإخراج (. استبدال القيم المتوسطة). يتم عرض القيم والقيم التلخيصية كلها على الشاشة بتنسيق نصي أو رسومي).
استخدام التسلسل العكسي لتطوير الفئات
في البرمجة الرياضية، يكون هدف الترميز عادةً هو قيمة الإخراج القياسية التي يرغب إجراء التحليل (مثل MultipleRegression أو TimeSeries أو ChiSquared) في إنتاجها. من منظور حل المشكلات، هذا يعني أنه يمكنك استخدام التسلسل العكسي لتطوير أساليب شبيهة بالرياضيات.
على سبيل المثال، تعرض شاشة إخراج الملخص نتائج إحصائيات ملخص واحدة أو أكثر. وتعتمد هذه النتائج الإحصائية الموجزة على حساب النتائج الإحصائية المتوسطة، وقد تتضمن هذه النتائج الإحصائية المتوسطة نتائج إحصائية متوسطة أعمق، وهكذا. يؤدي نهج التطوير القائم على الارتباط الخلفي إلى المبدأ التالي.
توقع وجود عدد كبير من
دروس الرياضيات التي تتضمن معظم أعمال تطوير الفصل حساب القيم المتوسطة والتلخيصية. من الناحية العملية، هذا يعني أنه لا ينبغي أن تتفاجأ إذا كان فصلك يحتوي على العديد من أساليب getter التي تحسب القيم المتوسطة والتلخيصية.
تخزين النتائج المتوسطة
يخزن نتائج عملية حسابية متوسطة داخل كائن نتيجة بحيث يمكنك استخدام النتائج المتوسطة كمدخل للعمليات الحسابية اللاحقة. يتم تنفيذ هذا المبدأ في تصميم لغة S. في السياق الحالي، يتم تنفيذ هذا المبدأ عن طريق تحديد متغيرات الحالة لتمثيل القيم المتوسطة المحسوبة والنتائج الموجزة.
ضبط التفضيلات لواجهة برمجة التطبيقات التفصيلية
عند تطوير نظام تسمية لوظائف الأعضاء ومتغيرات المثيلات في فئة SimpleLinearRegression، اكتشفت أنه إذا استخدمت أسماء أطول (شيء مثل getSumSquaredError بدلاً من getYY2 ) لوصف وظائف الأعضاء ومتغيرات المثيل، فسيتم ذلك من الأسهل فهم محتوى تشغيل الوظيفة ومعنى المتغيرات.
لم أتخلى تمامًا عن الأسماء المختصرة؛ ومع ذلك، عندما أستخدم صيغة مختصرة من الاسم، يجب أن أحاول تقديم ملاحظة تشرح معنى الاسم بشكل كامل. وجهة نظري هي أن أنظمة التسمية المختصرة للغاية شائعة في البرمجة الرياضية، ولكنها تزيد من صعوبة فهم وإثبات أن روتينًا رياضيًا معينًا صحيحًا أكثر مما يجب.
الكمال ليس هو الهدف
الهدف من تمرين البرمجة هذا ليس بالضرورة تطوير محرك رياضيات محسن للغاية وصارم لـ PHP. في المراحل المبكرة، يجب التركيز على تعلم كيفية تنفيذ اختبارات تحليلية ذات معنى وحل المشكلات الصعبة في هذا المجال.
متغيرات المثيلات
عند تصميم اختبار أو عملية إحصائية، يتعين عليك الإشارة إلى متغيرات المثيل التي تم الإعلان عنها.
يمكن تحديد اختيار متغيرات الحالة من خلال حساب القيم المتوسطة والتلخيصية الناتجة عن عملية التحليل. يمكن أن تحتوي كل قيمة متوسطة وملخصة على متغير مثيل مطابق، مع قيمة المتغير كخاصية كائن.
لقد استخدمت هذا التحليل لتحديد المتغيرات التي سيتم الإعلان عنها لفئة SimpleLinearRegression في القائمة 1. يمكن إجراء تحليل مماثل على إجراءات MultipleRegression أو ANOVA أو TimeSeries.
القائمة 1. متغيرات المثيل لفئة SimpleLinearRegression
<?php
// حقوق الطبع والنشر 2003، بول ماجر
// موزعة تحت رخصة GPL
فئة SimpleLinearRegression {
فار $ن؛
var $X = array();
var $Y = array();
فار $ConfInt;
فار $ألفا؛
فار $XMean;
فار $YMean;
فار $SumXX;
فار $SumXY;
فار $SumYY;
فار $Slope;
فار $YInt;
var $PredictedY = array();
فار $Error = array();
var $SquaredError = array();
فار $TotalError؛
فار $SumError;
var $SumSquaredError;
فار $ErrorVariance;
فار $StdErr;
var $SlopeStdErr;
var $SlopeVal; // T قيمة Slope
فار $YIntStdErr;
var $YIntTVal; // T value لـ Y Intercept
فار $R;
فار $RSquared;
فار $DF; // درجات الحرية
var $SlopeProb; // احتمالية تقدير المنحدر
var $YIntProb; // احتمالية تقدير تقاطع Y
var $AlphaTVal; // T Value لإعداد ألفا المحدد
فار $ConfIntOfSlope;
var $RPath = "/usr/local/bin/R"; // المسار الخاص بك هنا
var $format = "%01.2f"; // يُستخدم لتنسيق الإخراج
}
?>
المُنشئ
تقبل طريقة المُنشئ لفئة SimpleLinearRegression متجه X وY، ولكل منهما نفس عدد القيم. يمكنك أيضًا تعيين فاصل ثقة افتراضي بنسبة 95% لقيمة Y المتوقعة.
تبدأ طريقة المنشئ بالتحقق من أن نموذج البيانات مناسب للمعالجة. بمجرد اجتياز متجهات الإدخال اختبارات "الحجم المتساوي" و"القيمة الأكبر من 1"، يتم تنفيذ الجزء الأساسي من الخوارزمية.
يتضمن تنفيذ هذه المهمة حساب القيم المتوسطة والتلخيصية للعملية الإحصائية من خلال سلسلة من طرق الحصول. قم بتعيين قيمة الإرجاع لكل استدعاء أسلوب لمتغير مثيل للفئة. يضمن تخزين نتائج الحساب بهذه الطريقة توفر القيم المتوسطة والتلخيصية لإجراءات الاتصال في الحسابات المتسلسلة. يمكنك أيضًا عرض هذه النتائج عن طريق استدعاء طريقة الإخراج لهذه الفئة، كما هو موضح في القائمة 2.
القائمة 2. استدعاء طرق إخراج الفصل
<?php
// حقوق الطبع والنشر 2003، بول ماجر
// موزعة تحت رخصة GPL
الدالة SimpleLinearRegression($X, $Y, $ConfidenceInterval="95") {
$numX = العد($X);
$numY = العد($Y);
إذا ($numX != $numY) {
die("خطأ: يجب أن يكون حجم المتجهات X وY متماثلين.");
}
إذا ($numX <= 1) {
die("خطأ: يجب أن يكون حجم مصفوفة الإدخال 2 على الأقل.");
}
$this->n = $numX;
$this->X = $X;
$this->Y = $Y;
$this->ConfInt = $ConfidenceInterval;
$this->Alpha = (1 + ($this->ConfInt / 100)) / 2;
$this->XMean = $this->getMean($this->X);
$this->YMean = $this->getMean($this->Y);
$this->SumXX = $this->getSumXX();
$this->SumYY = $this->getSumYY();
$this->SumXY = $this->getSumXY();
$this->Slope = $this->getSlope();
$this->YInt = $this->getYInt();
$this->PredictedY = $this->getPredictedY();
$this->Error = $this->getError();
$this->SquaredError = $this->getSquaredError();
$this->SumError = $this->getSumError();
$this->TotalError = $this->getTotalError();
$this->SumSquaredError = $this->getSumSquaredError();
$this->ErrorVariance = $this->getErrorVariance();
$this->StdErr = $this->getStdErr();
$this->SlopeStdErr = $this->getSlopeStdErr();
$this->YIntStdErr = $this->getYIntStdErr();
$this->SlopeTVal = $this->getSlopeTVal();
$this->YIntTVal = $this->getYIntTVal();
$this->R = $this->getR();
$this->RSquared = $this->getRSquared();
$this->DF = $this->getDF();
$this->SlopeProb = $this->getStudentProb($this->SlopeTVal, $this->DF);
$this->YIntProb = $this->getStudentProb($this->YIntTVal, $this->DF);
$this->AlphaTVal = $this->getInverseStudentProb($this->Alpha, $this->DF);
$this->ConfIntOfSlope = $this->getConfIntOfSlope();
عودة صحيحة؛
}
?>
تم اشتقاق أسماء الطرق وتسلسلاتها من خلال مزيج من الروابط الخلفية والإشارة إلى كتاب الإحصاء الذي يستخدمه طلاب المرحلة الجامعية، والذي يشرح خطوة بخطوة كيفية حساب القيم المتوسطة. اسم القيمة المتوسطة التي أحتاج إلى حسابها مسبوق بـ "get"، وبالتالي اشتقاق اسم الطريقة.
ملاءمة النموذج للبيانات
يتم استخدام إجراء SimpleLinearRegression لإنتاج خط مستقيم ملائم للبيانات، حيث يحتوي السطر على المعادلة القياسية التالية:
y = b + mx
يبدو تنسيق PHP لهذه المعادلة مشابهًا للقائمة 3:
القائمة 3. قم بملاءمة النموذج مع البيانات المطابقة لمعادلة PHP
$PredictedY[$i] = $YIntercept + $Slope * $X[$i]
تستخدم فئة SimpleLinearRegression معيار المربعات الصغرى لاستخلاص تقديرات لمعلمات التقاطع Y (تقاطع Y) والمنحدر (المنحدر). تُستخدم هذه المعلمات المقدرة لإنشاء معادلة خطية (انظر القائمة 3) تمثل العلاقة بين قيم X وY.
باستخدام المعادلة الخطية المشتقة، يمكنك الحصول على قيمة Y المتوقعة لكل قيمة X. إذا كانت المعادلة الخطية تناسب البيانات بشكل جيد، فإن قيم Y المرصودة والمتوقعة تميل إلى أن تكون متسقة.
كيفية تحديد ما إذا كان هناك توافق جيد
تنشئ فئة SimpleLinearRegression عددًا لا بأس به من القيم التلخيصية. إحدى القيم الموجزة المهمة هي إحصائية T، التي تقيس مدى ملاءمة المعادلة الخطية للبيانات. إذا كانت الاتفاقية جيدة جدًا، فستميل إحصائية T إلى أن تكون كبيرة. إذا كانت إحصائية T صغيرة، فيجب استبدال المعادلة الخطية بنموذج يفترض أن متوسط قيم Y هو أفضل متنبئ (أي أن متوسط مجموعة من القيم عادة ما يكون متنبئا مفيدا) للملاحظة التالية، اجعلها النموذج الافتراضي).
لاختبار ما إذا كانت إحصائية T كبيرة بما يكفي لعدم اعتبار متوسط قيم Y كأفضل متنبئ، تحتاج إلى حساب الاحتمال العشوائي للحصول على إحصائية T. إذا كان احتمال الحصول على إحصائية T منخفضًا، فيمكنك رفض الفرضية الصفرية القائلة بأن المتوسط هو أفضل متنبئ، وبالتالي تكون واثقًا من أن النموذج الخطي البسيط يناسب البيانات جيدًا.
إذن، كيف يتم حساب احتمالية القيمة الإحصائية T؟
حساب احتمالية القيمة الإحصائية T
نظرًا لأن PHP تفتقر إلى إجراءات رياضية لحساب احتمالية القيمة الإحصائية T، فقد قررت ترك هذه المهمة لحزمة الحوسبة الإحصائية R (انظر www.r-project.org في الموارد) إلى الحصول على القيم اللازمة. أريد أيضًا أن ألفت الانتباه إلى هذه الحزمة لأن:
R يوفر العديد من الأفكار التي قد يحاكيها مطور PHP في مكتبة PHP الرياضية.
باستخدام R، من الممكن تحديد ما إذا كانت القيم التي تم الحصول عليها من مكتبة الرياضيات PHP متوافقة مع تلك التي تم الحصول عليها من الحزم الإحصائية المفتوحة المصدر الناضجة والمتاحة مجانًا.
يوضح الكود الموجود في القائمة 4 مدى سهولة ترك الأمر لـ R للحصول على قيمة.
القائمة 4. التعامل مع الحزمة الإحصائية R للحصول على قيمة
<?php
// حقوق الطبع والنشر 2003، بول ماجر
// موزعة تحت رخصة GPL
فئة SimpleLinearRegression {
var $RPath = "/usr/local/bin/R"; // المسار الخاص بك هنا
الدالة getStudentProb($T, $df) {
احتمال $ = 0.0؛
$cmd = "echo 'dt($T, $df)' | $this->RPath --slave";
نتيجة $ = shell_exec($cmd);
list($LineNumber, $Probability) = Explosion(" ", Trim($result));
إرجاع الاحتمالية $؛
}
الدالة getInverseStudentProb($alpha, $df) {
$InverseProbability = 0.0;
$cmd = "echo 'qt($alpha, $df)' | $this->RPath --slave";
نتيجة $ = shell_exec($cmd);
list($LineNumber, $InverseProbability) = Explosion(" ", Trim($result));
إرجاع $InverseProbability;
}
}
?>
لاحظ أنه تم تعيين المسار إلى الملف القابل للتنفيذ R واستخدامه في كلتا الوظيفتين. ترجع الدالة الأولى قيمة الاحتمال المرتبطة بإحصائيات T بناءً على توزيع T للطالب، بينما تحسب الدالة العكسية الثانية إحصائيات T المقابلة لإعداد ألفا المحدد. تُستخدم طريقة getStudentProb لتقييم مدى ملاءمة النموذج الخطي؛ وترجع طريقة getInverseStudentProb قيمة متوسطة تُستخدم لحساب فاصل الثقة لكل قيمة Y متوقعة.
نظرًا لضيق المساحة، من المستحيل بالنسبة لي أن أقوم بتفصيل جميع الوظائف في هذا الفصل واحدة تلو الأخرى، لذا إذا كنت تريد معرفة المصطلحات والخطوات المتضمنة في تحليل الانحدار الخطي البسيط، فإنني أشجعك على الرجوع إلى كتاب الإحصاء المستخدم من قبل طلاب المرحلة الجامعية.
دراسة الإرهاق
لتوضيح كيفية استخدام هذا الفصل، يمكنني استخدام البيانات من دراسة الإرهاق في إحدى الأدوات المساعدة. قام مايكل ليتر وكيمبرلي آن ميشان بدراسة العلاقة بين مقياس الإرهاق الذي يسمى مؤشر الإرهاق ومتغير مستقل يسمى التركيز. يشير التركيز إلى نسبة الاتصالات الاجتماعية للأشخاص التي تأتي من بيئة عملهم.
لدراسة العلاقة بين قيم مؤشر الاستهلاك وقيم التركيز للأفراد في عينتهم، قم بتحميل هذه القيم في مصفوفة مسماة بشكل مناسب وإنشاء مثيل لهذه الفئة بقيم المصفوفة هذه. بعد إنشاء مثيل للفصل، قم بعرض بعض القيم الموجزة التي أنشأها الفصل لتقييم مدى ملاءمة النموذج الخطي للبيانات.
تعرض القائمة 5 برنامجًا نصيًا يقوم بتحميل البيانات ويعرض قيم الملخص:
القائمة 5. برنامج نصي يقوم بتحميل البيانات ويعرض قيم الملخص
<?php
// BurnoutStudy.php
// حقوق الطبع والنشر 2003، بول ماجر
// موزعة تحت رخصة GPL
تضمين "SimpleLinearRegression.php"؛
// تحميل البيانات من دراسة الإرهاق
تركيز $ = صفيف (20،60،38،88،79،87،
68,12,35,70,80,92,
77,86,83,79,75,81,
75،77،77،77،17،85،96)؛
$ExhaustionIndex = صفيف (100,525,300,980,310,900,
410,296,120,501,920,810,
506,493,892,527,600,855,
709,791,718,684,141,400,970)؛
$slr = new SimpleLinearRegression($Concentration, $ExhaustionIndex);
$YInt = sprintf($slr->format, $slr->YInt);
$Slope = sprintf($slr->format, $slr->Slope);
$SlopeTVal = sprintf($slr->format, $slr->SlopeTVal);
$SlopeProb = sprintf("%01.6f", $slr->SlopeProb);
?>
<حدود الجدول='1' خلية الحشو='5'>
<تر>
<th align='right'>المعادلة:</th>
<td></td>
</tr>
<تر>
<th align='right'>T:</th>
<td></td>
</tr>
<تر>
<th align='right'>المشكلة > T:</th>
<td><td>
</tr>
</الجدول>
يؤدي تشغيل هذا البرنامج النصي من خلال متصفح الويب إلى الحصول على المخرجات التالية:
المعادلة: الإرهاق = -29.50 + (8.87 * التركيز)
ت: 6.03
Prob > T: 0.000005
يشير الصف الأخير من هذا الجدول إلى أن الاحتمال العشوائي للحصول على مثل هذه القيمة T الكبيرة منخفض جدًا. ويمكن الاستنتاج أن النموذج الخطي البسيط يتمتع بقدرة تنبؤية أفضل من مجرد استخدام متوسط قيم الاستهلاك.
يمكن استخدام معرفة تركيز الاتصالات في مكان عمل شخص ما للتنبؤ بمستوى الإرهاق الذي قد يستهلكه. تقول لنا هذه المعادلة: مقابل كل وحدة زيادة في قيمة التركيز، فإن قيمة استهلاك الفرد في مجال الخدمة الاجتماعية تزيد بمقدار 8 وحدات. وهذا دليل آخر على أنه لتقليل الإرهاق المحتمل، يجب على الأفراد في الخدمات الاجتماعية التفكير في تكوين صداقات خارج مكان عملهم.
وهذا مجرد رسم تقريبي لما قد تعنيه هذه النتائج. لاستكشاف الآثار المترتبة على مجموعة البيانات هذه بشكل كامل، قد ترغب في دراسة البيانات بمزيد من التفصيل للتأكد من أن هذا هو التفسير الصحيح. وفي المقالة التالية سأناقش ما هي التحاليل الأخرى التي ينبغي إجراؤها.
ماذا تعلمت؟
أولاً، ليس من الضروري أن تكون عالمًا في مجال الصواريخ لتطوير حزم رياضية ذات معنى تعتمد على لغة PHP. من خلال الالتزام بالتقنيات القياسية الموجهة للكائنات والاعتماد الصريح لأساليب حل المشكلات ذات التسلسل العكسي، فمن السهل نسبيًا استخدام PHP لتنفيذ بعض العمليات الإحصائية الأساسية.
من وجهة نظر التدريس، أعتقد أن هذا التمرين مفيد جدًا، فقط لأنه يتطلب منك التفكير في الاختبارات الإحصائية أو الإجراءات الروتينية في مستويات أعلى وأدنى من التجريد. بمعنى آخر، هناك طريقة رائعة لتكملة الاختبار الإحصائي أو التعلم الإجرائي وهي تنفيذ الإجراء كخوارزمية.
غالبًا ما يتطلب تنفيذ الاختبارات الإحصائية تجاوز المعلومات المقدمة وحل المشكلات واكتشافها بطريقة إبداعية. إنها أيضًا طريقة جيدة لاكتشاف الفجوات في المعرفة حول موضوع ما.
على الجانب السلبي، تجد أن PHP تفتقر إلى الوسائل الكامنة لتوزيعات العينات، وهو أمر ضروري لتنفيذ معظم الاختبارات الإحصائية. ستحتاج إلى السماح لـ R بإجراء المعالجة للحصول على هذه القيم، ولكن أخشى أنه لن يكون لديك الوقت أو الاهتمام لتثبيت R. يمكن لتطبيقات PHP الأصلية لبعض وظائف الاحتمال الشائعة أن تحل هذه المشكلة.
مشكلة أخرى: يقوم الفصل بإنشاء العديد من القيم المتوسطة والتلخيصية، لكن مخرجات الملخص لا تستفيد فعليًا من ذلك. لقد قدمت بعض النتائج غير العملية، ولكنها ليست كافية ولا منظمة بشكل جيد بحيث يمكنك تفسير نتائج التحليل بشكل مناسب. في الواقع، ليس لدي أي فكرة على الإطلاق عن كيفية دمج طريقة الإخراج في هذا الفصل. هذا يحتاج إلى معالجة.
وأخيرًا، يتطلب فهم البيانات أكثر من مجرد النظر إلى القيم الموجزة. تحتاج أيضًا إلى فهم كيفية توزيع نقاط البيانات الفردية. إحدى أفضل الطرق للقيام بذلك هي رسم بياناتك بيانيًا. مرة أخرى، لا أعرف الكثير عن هذا، ولكن إذا كنت تريد استخدام هذا الفصل لتحليل البيانات الحقيقية، فأنت بحاجة إلى حل هذه المشكلة.