本文给出了一个基于PHP的多元线性回归模拟曲线算法的描述实例。分享给大家参考,如下:
多元线性回归模型:y=b1x1b2x2b3x3.bnxn
根据一组数据:相似的arr _ x=[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]];arr_y=[5,10,15];我们最终要求的是一个数组,包括b1到BN;
方法:采用最小二乘法
公式:
我们只用公式的前半部分,也就是我们用矩阵来计算它
公式中的x是arr_x,二维数组可以看作矩阵,公式中的y是arr_y,也可以看作矩阵(5,10,15),但要垂直写。
然后根据公式,我们会发现需要用到矩阵乘法、换位和求逆;所以下面的代码是一个一个给出的:
公共函数get _ complete($ data,$i,$j) { /* x和y为矩阵数据的行数和列数*/$x=计数($ data);$y=计数($ data[0]);/*数据2为所求剩余矩阵*/$ data 2=[];for($ k=0;$ k $ x-1;$ k){ if($ k $ I){ for($ kk=0;$ kk $ y-1;$ kk){ if($ kk $ j){ $ data 2[$ k][$ kk]=$ data[$ k][$ kk];} else { $ data 2[$ k][$ kk]=$ data[$ k][$ kk 1];} } } else { for($ kk=0;$ kk $ y-1;$ kk){ if($ kk $ j){ $ data 2[$ k][$ kk]=$ data[$ k 1][$ kk];} else { $ data 2[$ k][$ kk]=$ data[$ k 1][$ kk 1];} } } }返回$ data2}/*计算矩阵行列式*/公共函数cal _ det($ data){ $ ans=0;if(count($ data[0])===2){ $ ans=$ data[0][0]* $ data[1][1]-$ data[0][1]* $ data[1][0];} else { for($ I=0;$ I count($ data[0]);$ I){ $ data _ temp=$ this-get _ complex($ data,0,$ I);if($ I % 2===0){ $ ans=$ ans $ data[0][$ I]*($ this-cal _ det($ data _ temp));} else { $ ans=$ ans-$ data[0][$ I]*($ this-cal _ det($ data _ temp));} } }返回$ ans}/*计算矩阵的伴随矩阵*/public function ajpoint($ data){ $ m=count($ data);$n=计数($ data[0]);$ data 2=[];对于($ I=0;$ I $ m;$ I){ for($ j=0;$ j $ n;$ j){ if(($i $ j)% 2===0){ $ data 2[$ I][$ j]=$ this-cal _ det($ this-get _ complex($ data,$ I,$ j));} else { $ data 2[$i][$ j]=-$ this-cal _ det($ this-get _ complex($ data,$ I,$ j));} } }返回$ this-trans($ data 2);}/*转置矩阵*/public function trans($ data){ $ I=count($ data);$j=计数($ data[0]);$ data 2=[];for($ k2=0;$ k2 $ j;$ k2){ for($ k1=0;$ k1 $ I;$ k1){ $ data 2[$ k2][$ k1]=$ data[$ k1][$ k2];} } /*将矩阵转置便可得到伴随矩阵*/return $ data 2;}/*求矩阵的逆,输入参数为原矩阵*/public function inv($ data){ $ m=count($ data);$n=计数($ data[0]);$ data 2=[];$ det _ val=$ this-cal _ det($ data);$ data 2=$ this-a point($ data);对于($ I=0;$ I $ m;$ I){ for($ j=0;$ j $ n;$ j){ $ data 2[$ I][$ j]=$ data 2[$ I][$ j]/$ det _ val;} }返回$ data2}/*求两矩阵的乘积*/公共函数getProduct($data1,$data2) { /*$data1为左乘矩阵*/$m1=计数($ data 1);$n1=计数($ data 1[0]);$m2=计数($ data 2);$n2=计数($ data 2[0]);$ data _ new=[];if ($n1!==$ m2){ return false;} else { for($ I=0;$ I=$ m1-1;$ I){ for($ k=0;$ k=$ N2-1;$ k){ $ data _ new[$ I][$ k]=0;for($ j=0;$ j=$ n1-1;$ j){ $ data _ new[$ I][$ k]=$ data 1[$ I][$ j]* $ data 2[$ j][$ k];} } } }返回$ data _ new}/*多元线性方程*/public function getParams($ arr _ x,$ arr _ y){ $ final=[];$ arr _ x _ t=$ this-trans($ arr _ x);$ result=$ this-GetProducT($ this-GetProducT($ this-inv($ this-GetProducT($ arr _ x _ t),$ arr _ x _ t);foreach($ result as $ key=$ val){ foreach($ val as $ _ k=$ _ v){ $ final[]=$ _ v;} }返回$ final}最后的getParams()方法就是最后求b参数数组的方法,传入一个二维数组arr_x,和一个一维数组arr_y就可以了。
这一般用于大数据分析,根据大数据来模拟和预测下面的发展和走势。
PS:这里为大家推荐两款相关模拟曲线工具供大家参考:
在线多项式曲线及曲线函数拟合工具:http://工具。JB 51。net/jis uan qi/create _ fun
在线绘制多项式/函数曲线图形工具:http://工具。JB 51。net/jis uan qi/fun _ draw
更多关于服务器端编程语言(专业超文本预处理器的缩写)相关内容感兴趣的读者可查看本站专题: 《PHP数据结构与算法教程》 、 《php程序设计算法总结》 、 《php字符串(string)用法总结》 、 《PHP数组(Array)操作技巧大全》 、 《PHP常用遍历算法与技巧总结》 及《PHP数学运算技巧总结》
希望本文所述对大家服务器端编程语言(专业超文本预处理器的缩写)程序设计有所帮助。