PHP 相關性係數計算

相關係數公式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;
}
相關文章
相關標籤/搜索