Найдите уравнение "наилучшего соответствия"
Прошло некоторое время с тех пор, как я учился в колледже, и знал, как рассчитать оптимальную линию, но мне нужно. Предположим, что у меня есть набор точек, и я хочу найти линию, которая является лучшей из этих точек.
Каково уравнение для определения линии наилучшего соответствия?
Как мне это сделать с PHP?
Ответы
Ответ 1
Дополнительный интерес - это, вероятно, насколько хорошо подходит линия.
Для этого используйте корреляцию Пирсона, здесь, в функции 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;
}
Ответ 2
Здесь статья, сравнивающая два способа подгонки строки к данным. Единственное, на что нужно обратить внимание, это то, что существует правильное теоретическое решение, но оно может иметь числовые проблемы. В статье показано, почему этот метод может потерпеть неудачу и дает другой метод, который лучше.
Ответ 3
Метод наименьших квадратов
http://en.wikipedia.org/wiki/Least_squares.
Эта книга Численные рецепты 3-го издания: искусство научных вычислений (в твердом переплете)
имеет все, что вам нужно для алгоритмов для реализации наименьших квадратов и других методов.
Ответ 4
Хотя вы можете использовать итеративный подход, вы можете непосредственно рассчитать наклон и перехват линии с учетом набора наблюдений с использованием метода наименьших квадратов. См. Раздел "Одномерный линейный случай" статью Википедии о линейной регрессии о том, как рассчитать коэффициенты a
и b
в y = a + bx
заданные множества точек (x,y)
.
Ответ 5
Вы можете проверить линейную регрессию или, более общо, .
Ответ 6
Реализован с 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";
Ответ 7
Часто используемый подход заключается в том, чтобы итеративно минимизировать сумму квадратов y-различий между вашими точками и функцией соответствия.