2010-12-30 23 views
2

私はトレンドラインを描画するために使用している次のPHP関数を持っています。ただし、散布図のすべての点の下に線をプロットすることがあります。私の機能にエラーがあるか、それを行う良い方法がありますか?私は、それが生成する線でそれと関係するかもしれないと思う、線の上か下であっても、すべての残差(散点から線までの距離)を陽性として扱います。この線形回帰関数を改善するにはどうすればよいですか?

function linear_regression($x, $y) { 

$n = count($x); 

$x_sum = array_sum($x); $y_sum = array_sum($y); 

$xx_sum = 0; $xy_sum = 0; 

for($i = 0; $i < $n; $i++) { $xy_sum+=($x[$i]*$y[$i]); $xx_sum+=($x[$i]*$x[$i]); } 

$m = (($n * $xy_sum) - ($x_sum * $y_sum))/(($n * $xx_sum) - ($x_sum * $x_sum)); $b = ($y_sum - ($m * $x_sum))/$n; return array("m"=>$m, "b"=>$b); 

} 

答えて

1

私はあなたの関数に直接問題はありませんが、間違った結果が生じることがある場合は、おそらくオーバーフローの問題があります。あなたが使用する数式は計算上堅牢ではありません。 Wikipediaのsimple linear regressionの記事は、(あなたが使っている数式の前で)異なる式を示しています。つまり、オーバーフローが起こりにくいということです。

+0

.... – user558383

3

これは

/** 
* linear regression function 
* @param $x array x-coords 
* @param $y array y-coords 
* @returns array() m=>slope, b=>intercept 
*/ 
function linear_regression($x, $y) { 

    // calculate number points 
    $n = count($x); 

    // ensure both arrays of points are the same size 
    if ($n != count($y)) { 
    trigger_error("linear_regression(): Number of elements in coordinate arrays do not match.", E_USER_ERROR); 
    } 

    // calculate sums 
    $x_sum = array_sum($x); 
    $y_sum = array_sum($y); 

    $xx_sum = 0; 
    $xy_sum = 0; 

    for($i = 0; $i < $n; $i++) { 
    $xy_sum+=($x[$i]*$y[$i]); 
    $xx_sum+=($x[$i]*$x[$i]); 
    } 

    // calculate slope 
    $m = (($n * $xy_sum) - ($x_sum * $y_sum))/(($n * $xx_sum) - ($x_sum * $x_sum)); 

    // calculate intercept 
    $b = ($y_sum - ($m * $x_sum))/$n; 

    // return result 
    return array("m"=>$m, "b"=>$b); 
} 

使用例リチャード@ホームによって作成された優れた機能である:それは、私はちょうど1ではなく0から私のx値を始めていたが判明し

var_dump(linear_regression(array(1, 2, 3, 4), array(1.5, 1.6, 2.1, 3.0))); 

https://richardathome.wordpress.com/2006/01/25/a-php-linear-regression-function/

関連する問題