2013年8月3日 星期六

用 PHP 求線性迴歸方程式

今天去左新還書借書, 找到這本 "真希望老師這樣教統計", 覺得很面熟, 好像有買過, 又怕萬一沒買, 所以先借再說, 結果回家一找, 真的在書架上有, 下週再還吧. 稍微翻了一下, 剛好翻到上回討論的變異係數, 哇, 解說非常清楚, 這種好書買來竟然擱在書架上這麼久! 接著看到介紹迴歸分析, 如果兩組數據相關係數很高, 可以用一條近似直線 Y=a + bX 來預估, 謂之線性迴歸, 嘿, 那這斜率 b 是否可以用來代表營益率的變化趨勢呢?
根據統計學理論, Y=a + bX 中,

b=X,Y 離均差交乘積和 / X 離均差平方和
a=Y 平均值 - b * X 平均值

其 PHP 程式如下 :

線性迴歸方程式 : http://mybidrobot.allalla.com/finance/regression.php [看原始碼]

    $X=explode(",",$_REQUEST["X"]);
    $Y=explode(",",$_REQUEST["Y"]);
    $xavg=array_sum($X)/count($X); //X 平均值
    $yavg=array_sum($Y)/count($Y); //Y 平均值
    $XMD=Array();         //X 離均差
    $YMD=Array();         //Y 離均差
    $mdcross_sum=0;       //X,Y 離均差交乘積和
    $xdif_square_sum=0;   //X 離均差平方和
    $count=count($X);
    for ($i=0; $i<count($X); $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 離均差平方和
         } //end of for
    $b=round($mdcross_sum/$xdif_square_sum, 2);  //計算斜率 b
    $a=round($yavg-$b*$xavg,2);                  //計算常數項 a
    echo "X=".join(", ",$X)."<br>";
    echo "Y=".join(", ",$Y)."<br>";
    echo "常數項 a=".$a."<br>";
    echo "斜率 b=".$b."<br>";
    echo "線性迴歸方程式 Y = ".$a." + (".$b.")X<br>";
    echo "X 平均值=".$xavg."<br>";
    echo "Y 平均值=".$yavg."<br>";
    echo "X 離均差=".join(", ",$XMD)."<br>";
    echo "Y 離均差=".join(", ",$YMD)."<br>";
    echo "X,Y 離均差交乘積和=".$mdcross_sum."<br>";
    echo "X 離均差平方和=".$xdif_square_sum."<br>";

參考 : SQL server一元线性回归统计说明

1 則留言 :

小叮噹 提到...

如果以下列為例 y=3.174+1.404x1+0.251x2
β0=3.174,β1=1.404,β2=0.251
如何用 PHP 程式語言撰寫公式算出其係數值。
https://theriseofdavid.github.io/2021/05/15/statistics/statistics-ch15/