时间:2016-02-24 14:05 来源: 我爱IT技术网 作者:佚名
欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【PHP实现简单线性回归之数据研究工具】,下面是详细的分享!
PHP实现简单线性回归之数据研究工具
概念简单线性回归建模背后的基本目标是从成对的X值和Y值(即X和Y测量值)组成的二维平面中找到最吻合的直线。一旦用最小方差法找到这条直线,就可以执行各种统计测试,以确定这条直线与观测到的Y值的偏离量吻合程度。
线性方程(y=mx+b)有两个参数必须根据所提供的X和Y数据估算出来,它们是斜率(m)和y轴截距(b)。一旦估算出这两个参数,就可以将观测值输入线性方程,并观察方程所生成的Y预测值。
要使用最小方差法估算出m和b参数,就要找到m和b的估计值,使它们对于所有的X值得到的Y值的观测值和预测值最小。观测值和预测值之差称为误差(yi-(mxi+b)),并且,如果对每个误差值都求平方,然后求这些残差的和,其结果是一个被称为预测平方差的数。使用最小方差法来确定最吻合的直线涉及寻找使预测方差最小的m和b的估计值。
可以用两种基本方法来找到满足最小方差法的估计值m和b。第一种方法,可以使用数值搜索过程设定不同的m和b值并对它们求值,最终决定产生最小方差的估计值。第二种方法是使用微积分找到用于估算m和b的方程。我不打算深入讨论推导出这些方程所涉及的微积分,但我确实在SimpleLinearRegression类中使用了这些分析方程,以找到m和b的最小平方估计值(请参阅SimpleLinearRegression类中的getSlope()和getYIntercept方法)。
即使拥有了可以用来找到m和b的最小平方估计值的方程,也并不意味着只要将这些参数代入线性方程,其结果就是一条与数据良好吻合的直线。这个简单线性回归过程中的下一步是确定其余的预测方差是否可以接受。
可以使用统计决策过程来否决“直线与数据吻合”这个备择假设。这个过程基于对T统计值的计算,使用概率函数求得随机大的观测值的概率。正如第1部分所提到的,SimpleLinearRegression类生成了为数众多的汇总值,其中一个重要的汇总值是T统计值,它可以用来衡量线性方程与数据的吻合程度。如果吻合良好,则T统计值往往是一个较大的值;如果T值很小,就应该用一个缺省模型代替您的线性方程,该模型假定Y值的平均值是最佳预测值(因为一组值的平均值通常可以是下一个观测值的有用的预测值)。
要测试T统计值是否大到可以不用Y值的平均值作为最佳预测值,需要计算随机获得T统计值的概率。如果概率很低,那就可以不采用平均值是最佳预测值这一无效假设,并且相应地可以确信简单线性模型是与数据良好吻合的。(有关计算T统计值概率的更多信息,请参阅第1部分。)
回过头讨论统计决策过程。它告诉您何时不采用无效假设,却没有告诉您是否接受备择假设。在研究环境中,需要通过理论参数和统计参数来建立线性模型备择假设。
您将构建的数据研究工具实现了用于线性模型(T测试)的统计决策过程,并提供了可以用来构造理论和统计参数的汇总数据,这些参数是建立线性模型所需要的。数据研究工具可以归类为决策支持工具,供知识工作者在中小规模的数据集中研究模式。
从学习的角度来看,简单线性回归建模值得研究,因为它是理解更高级形式的统计建模的必由之路。例如,简单线性回归中的许多核心概念为理解多次回归(MultipleRegression)、要素分析(FactorAnalysis)和时间序列(TimeSeries)等建立了良好的基础。
简单线性回归还是一种多用途的建模技术。通过转换原始数据(通常用对数或幂转换),可以用它来为曲线数据建模。这些转换可以使数据线性化,这样就可以使用简单线性回归来为数据建模。所生成的线性模型将被表示为与被转换值相关的线性公式。
概率函数
在前一篇文章中,我通过交由R来求得概率值,从而避开了用PHP实现概率函数的问题。我对这个解决方案并非完全满意,因此我开始研究这个问题:开发基于PHP的概率函数需要些什么。
我开始上网查找信息和代码。一个两者兼有的来源是书籍NumericalRecipesinC中的概率函数。我用PHP重新实现了一些概率函数代码(gammln.c和betai.c函数),但我对结果还是不满意。与其它一些实现相比,其代码似乎多了些。此外,我还需要反概率函数。
幸运的是,我偶然发现了JohnPezzullo的InteractiveStatisticalCalculation。John关于概率分布函数的网站上有我需要的所有函数,为便于学习,这些函数已用JavaScript实现。
我将StudentT和FisherF函数移植到了PHP。我对API作了一点改动,以便符合Java命名风格,并将所有函数嵌入到名为Distribution的类中。该实现的一个很棒的功能是doCommonMath方法,这个库中的所有函数都重用了它。我没有花费力气去实现的其它测试(正态测试和卡方测试)也都使用doCommonMath方法。
这次移植的另一个方面也值得注意。通过使用JavaScript,用户可以将动态确定的值赋给实例变量,譬如:
varPiD2=pi()/2
在PHP中不能这样做。只能把简单的常量值赋给实例变量。希望在PHP5中会解决这个缺陷。
请注意清单1中的代码并未定义实例变量—这是因为在JavaScript版本中,它们是动态赋予的值。
清单1.实现概率函数
<?php//Distribution.php//CopyrightJohnPezullo//ReleasedundersametermsasPHP.//PHPPortandOO'fyingbyPaulMeagherclassDistribution{functiondoCommonMath($q,$i,$j,$b){$zz=1;$z=$zz;$k=$i;while($k<=$j){$zz=$zz*$q*$k/($k-$b);$z=$z+$zz;$k=$k+2;}return$z;}functiongetStudentT($t,$df){$t=abs($t);$w=$t/sqrt($df);$th=atan($w);if($df==1){return1-$th/(pi()/2);}$sth=sin($th);$cth=cos($th);if(($df%2)==1){return1-($th+$sth*$cth*$this->doCommonMath($cth*$cth,2,$df-3,-1))/(pi()/2);}else{return1-$sth*$this->doCommonMath($cth*$cth,1,$df-3,-1);}}functiongetInverseStudentT($p,$df){$v=0.5;$dv=0.5;$t=0;while($dv>1e-6){$t=(1/$v)-1;$dv=$dv/2;if($this->getStudentT($t,$df)>$p){$v=$v-$dv;}else{$v=$v+$dv;}}return$t;}functiongetFisherF($f,$n1,$n2){//implementedbutnotshown}functiongetInverseFisherF($p,$n1,$n2){//implementedbutnotshown}}?>- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
