2008-12-13 3 views
11

Прошло некоторое время с тех пор, как я учился в колледже, и знал, как рассчитать наилучшую линию, но мне нужно. Предположим, что у меня есть набор точек, и я хочу найти линию, которая является лучшей из этих точек.Найти уравнение «наилучшего соответствия»

Каково уравнение для определения наилучшего соответствия линии? Как мне это сделать с PHP?

ответ

2

Дополнительный интерес, вероятно, насколько хороша по размеру линия. Для этого используйте корреляции Пирсона, здесь в функции PHP:

/** 
* returns the pearson correlation coefficient (least squares best fit line) 
* 
* @param array $x array of all x vals 
* @param array $y array of all y vals 
*/ 

function pearson(array $x, array $y) 
{ 
    // number of values 
    $n = count($x); 
    $keys = array_keys(array_intersect_key($x, $y)); 

    // get all needed values as we step through the common keys 
    $x_sum = 0; 
    $y_sum = 0; 
    $x_sum_sq = 0; 
    $y_sum_sq = 0; 
    $prod_sum = 0; 
    foreach($keys as $k) 
    { 
     $x_sum += $x[$k]; 
     $y_sum += $y[$k]; 
     $x_sum_sq += pow($x[$k], 2); 
     $y_sum_sq += pow($y[$k], 2); 
     $prod_sum += $x[$k] * $y[$k]; 
    } 

    $numerator = $prod_sum - ($x_sum * $y_sum/$n); 
    $denominator = sqrt(($x_sum_sq - pow($x_sum, 2)/$n) * ($y_sum_sq - pow($y_sum, 2)/$n)); 

    return $denominator == 0 ? 0 : $numerator/$denominator; 
} 
+0

btw, коэффициент Пирсона колеблется от 0 (без корреляции) до 1,0 (точки лежат на прямой линии) – ruquay 2008-12-13 00:46:46

0

Часто используемый подход заключается в том, чтобы итеративно минимизировать сумму квадратов y-различий между вашими точками и функцией подгонки.

4

Хотя вы можете использовать итеративный подход, вы можете непосредственно рассчитать наклон и перехват линии с учетом набора наблюдений с использованием метода наименьших квадратов. См. Раздел «Одномерный линейный случай» the Wikipedia article on linear regression для расчета коэффициентов a и b в y = a + bx данных наборов (x,y) баллов.

6

Вот article, сравнивающий два способа подгонки строки к данным. Единственное, на что нужно обратить внимание, это то, что существует правильное теоретическое решение, но оно может иметь числовые проблемы. В статье показано, почему этот метод может потерпеть неудачу и дает другой метод, который лучше.

+1

+1 Это, безусловно, лучший ответ, другой метод значительно уступает, хотя и более популярными. – Muhd 2011-06-08 18:02:02

2

Выполнено с wiki-страницы, не проверено.

$sx = 0; 
$sy = 0; 
$sxy = 0; 
$sx2 = 0; 
$n = count($data); 
foreach ($data as $x => $y) 
{ 
    $sx += $x; 
    $sy += $y; 
    $sxy += $x * $y; 
    $sx2 += $x * $x; 
} 
$beta = ($n*$sxy - $sx*$sy)/($n*$sx2 - $sx*$sx); 
$alpha = $sy/$n - $sx*$beta/$n; 

echo "y = $alpha + $beta x"; 
Смежные вопросы