相關係數公式spa
參考:https://baike.baidu.com/item/相關係數debug
PHP 實現代碼code
public static function calc($list) { $cv = []; $X = []; $Y = []; foreach ($list as $r) { if (count($r) != 2) { continue; } $X[] = floatval($r[0]); $Y[] = floatval($r[1]); } $xavg = array_sum($X)/count($X); // X 平均值 $yavg = array_sum($Y)/count($Y); // Y 平均值 $XMD = []; // X 離均差 $YMD = []; // Y 離均差 $mdcross_sum = 0; // X,Y 離均差交乘積和 $xdif_square_sum = 0; // X 離均差平方和 $count = count($X); for ($i=0; $i<$count; $i++) { $xdif = (float)$X[$i]-$xavg; // X 離均差 $ydif = (float)$Y[$i]-$yavg; // Y 離均差 $XMD[$i] = $xdif; $YMD[$i] = $ydif; $mdcross_sum += $xdif*$ydif; // X,Y 離均差交乘積和 $xdif_square_sum += pow($xdif, 2); // X 離均差平方和 } if ($xdif_square_sum == 0) { $b = 0; $a = 0; } else { $b = round($mdcross_sum/$xdif_square_sum, 2); // 計算斜率 b $a = round($yavg-$b*$xavg, 2); // 計算常數項 a } /* $str = ''; $str .= "X = ".join(", ",$X)."<br>"; $str .= "Y = ".join(", ",$Y)."<br>"; $str .= "常數項 a = ".$a."<br>"; $str .= "斜率 b = ".$b."<br>"; $str .= "線性迴歸方程式 Y = ".$a." + (".$b.")X<br>"; $str .= "X 平均值 = ".$xavg."<br>"; $str .= "Y 平均值 = ".$yavg."<br>"; $str .= "X 離均差 = ".join(", ",$XMD)."<br>"; $str .= "Y 離均差 = ".join(", ",$YMD)."<br>"; $str .= "X,Y 離均差交乘積和 = ".$mdcross_sum."<br>"; $str .= "X 離均差平方和 = ".$xdif_square_sum."<br>"; SysLog::add($str, 'debug'); */ $cv['a'] = $a; $cv['b'] = $b; // 計算相關係數 $cv_up = 0; $cv_down_x = 0; $cv_down_y = 0; for ($i=0; $i<$count; $i++) { $cv_up += ($X[$i]-$xavg) * ($Y[$i]-$yavg); $cv_down_x += pow($X[$i]-$xavg, 2); $cv_down_y += pow($Y[$i]-$yavg, 2); } if ($cv_down_x * $cv_down_y == 0) { $cv['cv'] = 0; } else { $cv['cv'] = round($cv_up / sqrt($cv_down_x * $cv_down_y), 2); } return $cv; }