美文网首页
利用php进行线性回归

利用php进行线性回归

作者: phpangel | 来源:发表于2017-12-15 07:57 被阅读0次

    笔者在一家中石化内部的企业工作,主要从事高分子聚合物的相关开发。
    目前因工作需要,需要学习聚合物特性黏度测试方面的知识,采用多点稀释法进行测试。在得到数据后,通过外推法求得纯熔体的特性黏度。
    比如我们在三种浓度下测得特性黏度分别如下:
    纯溶剂 t0=76.56s ηr ηsp ηsp/c lnηr/c
    0.04g/dl t1=228.16 2.98 1.98 49.5 27.3
    0.02g/dl t2=135.37 1.77 0.77 38.5 28.5
    0.01g/dl t3=105.25 1.37 0.37 37 31.38
    定义为溶液浓度无限稀释时的比浓黏度和比浓对数黏度。其值与浓度无关。


    特性黏度

    我们可以通过作图推算出浓度为零时的特性黏度,如下图:


    特性黏度推算
    当然我们更准确的可以通过EXCEL工具进行作图并线性模拟出计算公式。
    因为笔者在PHP编程方面颇有一些研究,下面通过PHP编程计算出线性方程式。
    如果两组数据相关系数很高, 可以用一条近似直线Y=a + bX 来预估, 谓之线性回归
    根据统计学理论, Y = a + bX 中
    斜率 b = X,Y 离均差交乘积和 / X离均差平方和
    常数项 a = Y平均值 - b * X平均值
    具体实现代码如下:
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
        <title>线性回归 Linear Regression</title>
    </head>
    <body>
    <h2>计算线性回归方程式 Y = a + bX</h2>
    <p>
        如果两组数据相关系数很高, 可以用一条近似直线Y=a + bX 来预估, 谓之线性回归<br />
        根据统计学理论, Y = a + bX 中 <br />
     
        斜率 b = X,Y 离均差交乘积和 / X离均差平方和 <br />
        常数项 a = Y平均值 - b * X平均值<br />
    </p>
    <?php
    header("Content-Type: text/html; charset=utf-8");
    if (empty($_REQUEST["X"])) {
        ?>
        <form method="post" action="jisuan.php">
            X : <input type="text" name="X" size="30" value="25,23,27,35,30"><br>
            Y : <input type="text" name="Y" size="30" value="35,27,36,45,42"><br>
            <input type="submit" value="ok">
        </form>
    <?php
    } else {
        $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; $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>";
    }
     
    echo '<hr />';
     
    echo '计算两点之间的角度。';
    $a = array('x' => 10, 'y' => 0);
    $c = array('x' => 80, 'y' => 80);
    $pi_v = atan2($c['y'] - $a['y'], $c['x'] - $a['x']);
    $n_v = rad2deg($pi_v);
    echo '弧度:',$pi_v,' 角度:',$n_v;
     
     
    ?>
    </body>
    </html>
    

    根据我们前面提供的数据,可计算出
    X = 0.04, 0.02
    Y = 7, 6.5
    常数项 a = 6
    斜率 b = 25
    线性回归方程式 Y = 6 + (25)X
    X 平均值 = 0.03
    Y 平均值 = 6.75
    X 离均差 = 0.01, -0.01
    Y 离均差 = 0.25, -0.25
    X,Y 离均差交乘积和 = 0.005
    X 离均差平方和 = 0.0002

    相关文章

      网友评论

          本文标题:利用php进行线性回归

          本文链接:https://www.haomeiwen.com/subject/igdpuxtx.html