Найти уравнение «наилучшего соответствия» - PullRequest
11 голосов
/ 13 декабря 2008

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

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

Ответы [ 7 ]

6 голосов
/ 13 декабря 2008

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

5 голосов
/ 13 декабря 2008

Метод наименьших квадратов http://en.wikipedia.org/wiki/Least_squares. Эта книга Числовые рецепты, 3-е издание: Искусство научных вычислений (в твердом переплете) есть все, что нужно для алгоритмов для реализации наименьших квадратов и других методов.

4 голосов
/ 13 декабря 2008

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

2 голосов
/ 13 декабря 2008

Дополнительный интерес, вероятно, заключается в том, насколько хорошо подходит линия. Для этого используйте корреляцию Пирсона, здесь в функции 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 голосов
/ 13 декабря 2008

Реализовано со страницы вики, не проверено.

$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";
2 голосов
/ 13 декабря 2008

Возможно, вы захотите проверить линейную регрессию или, в более общем случае, аппроксимацию кривой .

0 голосов
/ 13 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...