سؤال

لذلك قرأت السؤالين ذوي الصلة لحساب خط الاتجاه للرسم البياني ، لكنني ما زلت ضائعًا.

لدي مجموعة من الإحداثيات 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 نقاط البيانات.

alt text

على سبيل المثال البيانات الواردة في التعليق أدناه ، لا تتناسب وظيفة لوغاريتمية بشكل جيد.

alt text

حل المربعات الصغرى هو y = -514.734835478 + 2180.51562281 * log(x) وهو في الأساس خط في هذا المجال.

نصائح أخرى

أوصي باستخدام المكتبة: http://www.dreque.net/projects/polynomialregress

متوفر بواسطة الملحن: https://packagist.org/packages/dr-que/polynomial-regression.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top