|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果你单纯是为了做网站赚钱,我想你还是别学php的好,去学ASP,JSP好了,毕竟它们有实力雄厚的公司去支持它们。 <P> 简介 <P> 与其它开放源码言语(好比 Perl 和 Python)比拟,PHP 社区短少强无力的任务来开辟数学库。形成这类情况的一个缘由多是因为已存在大批成熟的数学东西,这能够障碍了社区自行开辟 PHP 东西的任务。例如,我曾研讨过一个功效壮大的东西 S System,它具有一组使人印象深入的统计库,专门被设计成用来剖析数据集,而且在 1998 年因为其言语设计而取得了 ACM 奖。假如 S 或其开放源码同类 R 仅仅是一个 exec_shell 挪用,那末为什么还要费事用 PHP 完成不异的统计盘算功效呢?有关 S System、它的 ACM 奖或 R 的更多信息,请参阅参考材料。 <P> 岂非这不是在华侈开辟人员的精神吗?假如开辟 PHP 数学库的念头是出自节俭开辟人员的精神和利用最好的东西来完成任务,那末 PHP 如今的课题是很成心义的。 <P> 另外一方面,出于教授教养念头能够会勉励对 PHP 数学库的开辟。关于大约 10% 的人来讲,数学是个值得探究的风趣课题。关于那些同时还纯熟使用 PHP 的人来讲,PHP 数学库的开辟可以加强数学进修进程,换句话说,不要只浏览有关 T 测试的章节,还要完成一个能盘算响应的两头值并用尺度格局显示它们的类。 <P> 经由过程指点和练习,我但愿证实开辟 PHP 数学库并非一项很难的义务,它能够代表一项风趣的手艺和进修困难。在本文中,我将供应一个 PHP 数学库示例,名为 SimpleLinearRegression,它演示了一个可以用来开辟 PHP 数学库的通用办法。让咱们从会商一些通用的准绳入手下手,这些准绳指点我开辟这个 SimpleLinearRegression 类。 <P> 指点准绳 <P> 我利用了六个通用准绳来指点 SimpleLinearRegression 类的开辟。 <P> 每一个剖析模子创立一个类。 <P> 利用逆向链接来开辟类。 <P> 估计有大批的 getter。 <P> 存储两头了局。 <P> 为具体的 API 制订首选项。 <P> 精美绝伦并不是方针。 <P> 让咱们更具体地逐条研讨这些指点方针。 <P> 每一个剖析模子创立一个类 <P> 每种次要的剖析测试或进程应该有一个称号与测试或进程名不异的 PHP 类,这个类包括了输出函数、盘算两头值和汇总值的函数和输入函数(将两头值和汇总值用文本或图形格局全体显示在屏幕上)。 <P> 利用逆向链接来开辟类 <P> 在数学编程中,编码的方针凡是是剖析进程(好比 MultipleRegression、TimeSeries 或 ChiSquared)所但愿生成的尺度输入值。从处理成绩的角度动身,这意味着您可使用逆向链接来开辟数学类的办法。 <P> 例如,汇总输入屏幕显示了一个或多个汇总统计了局。这些汇总统计了局依附于两头统计了局的盘算,这些两头统计了局又能够会触及到更深一层的两头统计了局,以此类推。这个基于逆向链接的开辟办法导出了下一个准绳。 <P> 估计有大批的 getter 数学类的大局部类开辟任务都触及到盘算两头值和汇总值。实践上,这意味着,假如您的类包括很多盘算两头值和汇总值的 getter 办法,您不该当感应惊奇。
<P> 存储两头了局 将两头盘算了局存储在了局对象内,如许您就能够将两头了局用作后续盘算的输出。在 S 言语设计中实行了这一准绳。在以后情况下,经由过程选择实例变量来暗示盘算失掉的两头值和汇总了局,从而实行了该准绳。
为具体的 API 制订首选项
<P> 当为 SimpleLinearRegression 类中的成员函数和实例变量制订定名计划时,我发明:假如我利用较长的称号(相似于 getSumSquaredError 如许的称号,而不是 getYY2)来描写成员函数和实例变量,那末就更轻易懂得函数的操作内容和变量所代表的意义。 <P> 我没有完整保持简写称号;然而,当我用简写模式的称号时,我得想法供应正文以完全论述该称号的寄义。我的意见是:高度简写的定名计划在数学编程中很罕见,但它们使得了解和证实某个数学例程是不是墨守成规更加坚苦,而本来不用形成此种坚苦。 <P> 精美绝伦并不是方针 <P> 这个编码实习的方针不是必定要为 PHP 开辟高度优化和严厉的数学引擎。在初期阶段,应该强调进修完成意义严重的剖析测试,和处理这方面的困难。 <P> 实例变量:当对统计测试或进程停止建模时,您需求指作声明哪些实例变量。 <P> 实例变量的选择可以经由过程申明由剖析进程生成的两头值和汇总值来肯定。每一个两头值和汇总值都可以有一个响应的实例变量,将变量的值作为对象属性。 <P> 我采取如许的剖析来肯定为清单 1 中的 SimpleLinearRegression 类声明哪些变量。可以对MultipleRegression、ANOVA 或 TimeSeries 进程履行相似的剖析。 <P> - <?php // Copyright 2003, Paul Meagher // Distributed under GPL class SimpleLinearRegression { var $n; var $X = array(); var $Y = array(); var $ConfInt; var $Alpha; var $XMean; var $YMean; var $SumXX; var $SumXY; var $SumYY; var $Slope; var $YInt; var $PredictedY = array(); var $Error = array(); var $SquaredError = array(); var $TotalError; var $SumError; var $SumSquaredError; var $ErrorVariance; var $StdErr; var $SlopeStdErr; var $SlopeVal; // T value of Slope var $YIntStdErr; var $YIntTVal; // T value for Y Intercept var $R; var $RSquared; var $DF; // Degrees of Freedom var $SlopeProb; // Probability of Slope Estimate var $YIntProb; // Probability of Y Intercept Estimate var $AlphaTVal; // T Value for given alpha setting var $ConfIntOfSlope; var $RPath = "/usr/local/bin/R"; // Your path here var $format = "%01.2f"; // Used for formatting output } ?>
复制代码 <P> 清单 1. SimpleLinearRegression 类的实例变量 机关函数
<P> SimpleLinearRegression 类的机关函数办法承受一个 X 和一个 Y 向量,每一个向量都有不异数目的值。您还可觉得您估计的 Y 值设置一个缺省为 95% 的相信区间(confidence interval)。 <P> 机关函数办法从验证数据模式是不是合适于处置入手下手。一旦输出向量经由过程了“巨细相等”和“值大于 1”测试,就履行算法的中心局部。 <P> 履行这项义务触及到经由过程一系列 getter 办法盘算统计进程的两头值和汇总值。将每一个办法挪用的前往值赋给该类的一个实例变量。用这类办法存储盘算了局确保了前后链接的盘算中的挪用例程可使用两头值和汇总值。还可以经由过程挪用该类的输入办法来显示这些了局,如清单 2 所描写的那样。 <P> - <?php // Copyright 2003, Paul Meagher // Distributed under GPL function SimpleLinearRegression($X, $Y, $ConfidenceInterval="95") { $numX = count($X); $numY = count($Y); if ($numX != $numY) { die("Error: Size of X and Y vectors must be the same."); } if ($numX <= 1) { die("Error: Size of input array must be at least 2."); } $this->n = $numX; $this->X = $X; $this->Y = $Y; $this->ConfInt = $ConfidenceInterval; $this->Alpha = (1 + ($this->ConfInt / 100) ) / 2; $this->XMean = $this->getMean($this->X); $this->YMean = $this->getMean($this->Y); $this->SumXX = $this->getSumXX(); $this->SumYY = $this->getSumYY(); $this->SumXY = $this->getSumXY(); $this->Slope = $this->getSlope(); $this->YInt = $this->getYInt(); $this->PredictedY = $this->getPredictedY(); $this->Error = $this->getError(); $this->SquaredError = $this->getSquaredError(); $this->SumError = $this->getSumError(); $this->TotalError = $this->getTotalError(); $this->SumSquaredError = $this->getSumSquaredError(); $this->ErrorVariance = $this->getErrorVariance(); $this->StdErr = $this->getStdErr(); $this->SlopeStdErr = $this->getSlopeStdErr(); $this->YIntStdErr = $this->getYIntStdErr(); $this->SlopeTVal = $this->getSlopeTVal(); $this->YIntTVal = $this->getYIntTVal(); $this->R = $this->getR(); $this->RSquared = $this->getRSquared(); $this->DF = $this->getDF(); $this->SlopeProb = $this->getStudentProb($this->SlopeTVal, $this->DF); $this->YIntProb = $this->getStudentProb($this->YIntTVal, $this->DF); $this->AlphaTVal = $this->getInverseStudentProb($this->Alpha, $this->DF); $this->ConfIntOfSlope = $this->getConfIntOfSlope(); return true; } ?>
复制代码 <P> 清单 2. 挪用类输入办法第1步环境配置好了,你算了进了1小步了,那么第2步呢 就是调出第1个程序 一般都是用hello world,视频教程里面我都做了,hello world |
|