كيف يمكنني حساب خط الاتجاه في PHP؟
-
03-10-2019 - |
سؤال
لذلك قرأت السؤالين ذوي الصلة لحساب خط الاتجاه للرسم البياني ، لكنني ما زلت ضائعًا.
لدي مجموعة من الإحداثيات XY ، وأريد أن أتوصل إلى مجموعة أخرى من الإحداثيات XY (يمكن أن تكون أقل من إحداثيات) تمثل خط اتجاه لوغاريتمي باستخدام PHP.
أقوم بتمرير هذه المصفوفات إلى JavaScript لرسم الرسوم البيانية على جانب العميل.
المحلول
لوغاريتمي المربعات الصغرى
نظرًا لأننا يمكننا تحويل وظيفة لوغاريتمية إلى خط عن طريق أخذ log
التابع x
القيم ، يمكننا تنفيذ أ المربعات الصغرى الخطية منحنى تركيب. في الواقع ، تم القيام بالعمل من أجلنا ويتم تقديم حل في عالم الرياضيات.
باختصار ، لقد منحنا $X
و $Y
القيم الناتجة عن توزيع مثل y = a + b * log(x)
. سوف تعطي طريقة المربعات الصغرى بعض القيم aFit
و bFit
أن يقلل من المسافة من منحنى حدودي إلى نقاط البيانات المقدمة.
فيما يلي مثال على التنفيذ في PHP:
أولاً ، سأقوم بإنشاء بعض البيانات العشوائية مع التوزيع الأساسي المعروف $a
و $b
// True parameter valaues
$a = 10;
$b = 5;
// Range of x values to generate
$x_min = 1;
$x_max = 10;
$nPoints = 50;
// Generate some random points on y = a * log(x) + b
$X = array();
$Y = array();
for($p = 0; $p < $nPoints; $p++){
$x = $p / $nPoints * ($x_max - $x_min) + $x_min;
$y = $a + $b * log($x);
$X[] = $x + rand(0, 200) / ($nPoints * $x_max);
$Y[] = $y + rand(0, 200) / ($nPoints * $x_max);
}
الآن ، إليك كيفية استخدام المعادلات المقدمة لتقديرها $a
و $b
.
// Now convert to log-scale for X
$logX = array_map('log', $X);
// Now estimate $a and $b using equations from Math World
$n = count($X);
$square = create_function('$x', 'return pow($x,2);');
$x_squared = array_sum(array_map($square, $logX));
$xy = array_sum(array_map(create_function('$x,$y', 'return $x*$y;'), $logX, $Y));
$bFit = ($n * $xy - array_sum($Y) * array_sum($logX)) /
($n * $x_squared - pow(array_sum($logX), 2));
$aFit = (array_sum($Y) - $bFit * array_sum($logX)) / $n;
يمكنك بعد ذلك إنشاء نقاط لجافا سكريبت بكثافة كما تريد:
$Yfit = array();
foreach($X as $x) {
$Yfit[] = $aFit + $bFit * log($x);
}
في هذه الحالة ، تقدر الرمز bFit = 5.17
و aFit = 9.7
, ، وهو قريب جدًا فقط 50
نقاط البيانات.
على سبيل المثال البيانات الواردة في التعليق أدناه ، لا تتناسب وظيفة لوغاريتمية بشكل جيد.
حل المربعات الصغرى هو y = -514.734835478 + 2180.51562281 * log(x)
وهو في الأساس خط في هذا المجال.
نصائح أخرى
أوصي باستخدام المكتبة: http://www.dreque.net/projects/polynomialregress
متوفر بواسطة الملحن: https://packagist.org/packages/dr-que/polynomial-regression.