我通常可以轻松地抓住这些,但......
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));
$divisor = (($n * $xx_sum) – ($x_sum * $x_sum));
if ($divisor == 0){
$m = 0;
} else {
$m = (($n * $xy_sum) – ($x_sum * $y_sum)) / $divisor;
}
// calculate intercept
$b = ($y_sum - ($m * $x_sum)) / $n;
// return result
return array("m"=>$m, "b"=>$b);
}
var_dump( linear_regression(array(1, 2, 3, 4, 4), array(1.5, 1.6, 2.1, 3.0, 6)) );
错误发生在$divisor = (($n * $xx_sum) – ($x_sum * $x_sum));
任何想法为什么?
答案 0 :(得分:2)
减号是一个奇特的unicode破折号(我认为是破折号)而不是常规的ascii - 字符。
答案 1 :(得分:1)
不要问我是怎么发现的,但你的“ - ”不是真正的“ - ”,是另一个角色,但却有相同的表现
好的,你没有问我,但我发现在http://writecodeonline.com/php/,它不认识你的“ - ”字符
现在使用真实的“ - ”工作代码,您可以复制粘贴,并查看:
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));
$divisor = (($n * $xx_sum) - ($x_sum * $x_sum));
if ($divisor == 0){
$m = 0;
} else {
$m = (($n * $xy_sum) - ($x_sum * $y_sum)) / $divisor;
}
// calculate intercept
$b = ($y_sum - ($m * $x_sum)) / $n;
// return result
return array("m"=>$m, "b"=>$b);
}
var_dump( linear_regression(array(1, 2, 3, 4, 4), array(1.5, 1.6, 2.1, 3.0, 6)) );
答案 2 :(得分:0)
我重写了这样的违规行:
$divisor = (($n*$xx_sum)-($x_sum * $x_sum));
错误消失了。稍微戳了一下后,错误似乎与中间的减号有关。删除它并重新输入它似乎可以解决问题。
请参阅this fiddle:
答案 3 :(得分:0)
Adam是对的,但是,你没有关闭for
循环。试试吧。
此外,减号在这里是错误的标志:
$divisor = (($n * $xx_sum) - ($x_sum * $x_sum));
以及:
$m = (($n * $xy_sum) - ($x_sum * $y_sum)) / $divisor;
我已清理的功能版本,其中已关闭for
循环。
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));
$divisor = (($n * $xx_sum) - ($x_sum * $x_sum));
if ($divisor == 0) {
$m = 0;
}
else {
$m = (($n * $xy_sum) - ($x_sum * $y_sum)) / $divisor;
}
// calculate intercept
$b = ($y_sum - ($m * $x_sum)) / $n;
}
// return result
return array("m"=>$m, "b"=>$b);
} // linear_regression