Прошло некоторое время с тех пор, как я учился в колледже, и знал, как рассчитать наилучшую линию, но мне нужно. Предположим, что у меня есть набор точек, и я хочу найти линию, которая является лучшей из этих точек.
Каково уравнение для определения линии наилучшего соответствия? Как мне это сделать с PHP?
Дополнительного интереса, вероятно, насколько хорошо подходит линия. Для этого используйте корреляцию Пирсона, здесь, в функции 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; }
Вот статья, сравнивающая два способа подгонки строки к данным. Единственное, на что нужно обратить внимание, это то, что существует правильное теоретическое решение, но оно может иметь числовые проблемы. В статье показано, почему этот метод может потерпеть неудачу и дает другой метод, который лучше.
Метод наименьших квадратов http://en.wikipedia.org/wiki/Least_squares . В этой книге Numerical Recipes 3rd Edition: The Art of Scientific Computing (Hardcover) есть все, что вам нужно для алгоритмов для реализации наименьших квадратов и других методов.
Хотя вы можете использовать итеративный подход, вы можете непосредственно рассчитать наклон и перехват линии с учетом набора наблюдений с использованием метода наименьших квадратов. См. Раздел «Одномерный линейный случай» статьи Википедии о линейной регрессии для вычисления коэффициентов a
и b
в y = a + bx
заданных множеств точек (x,y)
.
Возможно, вы захотите проверить линейную регрессию или, в более общем плане, кривую .
Выполнено с 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";
Часто используемый подход заключается в том, чтобы итеративно минимизировать сумму квадратов y-различий между вашими точками и функцией соответствия.