自從我上大學以來,我已經有一段時間了,知道如何計算最合適的線,但我發現自己需要。假設我有一組點,並且我想找到那些點中最好的線。找到一個「最合適的」方程
什麼是確定最佳擬合線的公式? 我該怎麼用PHP來做?
自從我上大學以來,我已經有一段時間了,知道如何計算最合適的線,但我發現自己需要。假設我有一組點,並且我想找到那些點中最好的線。找到一個「最合適的」方程
什麼是確定最佳擬合線的公式? 我該怎麼用PHP來做?
額外的興趣可能是一個合適的線是多好。 爲此,使用Pearson相關,在這裏一個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;
}
一個常用的方法是迭代地最小化點和擬合函數之間的平方y-差的總和。
雖然您可以使用迭代方法,但您可以使用最小二乘方法直接計算給定一組觀測值的線的斜率和截距。有關如何計算a
和b
中的y = a + bx
給定組的(x,y)
點的the Wikipedia article on linear regression的「單變量線性案例」部分。
最小二乘法 http://en.wikipedia.org/wiki/Least_squares。 這本書Numerical Recipes 3rd Edition: The Art of Scientific Computing (Hardcover) 擁有所有你需要的算法來實現最小二乘和其他技術。
您可能想要查看linear regression或更一般地curve fitting。
從維基頁面實施,未經測試。
$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";
順便說一句,皮爾遜係數範圍從0(無相關性)到1.0(點位於一條直線上) – ruquay 2008-12-13 00:46:46