Linux脚本开发技术数学库在PHP中的重要性
作者:小贤 | 来源:互联网 | 2017-06-26 04:46
文章标题:Linux脚本开发技术数学库在PHP中的重要性。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类
简介 与其它开放源码语言(比如 Perl 和 Python)相比,PHP 社区缺少强有力的工作来开发数学库。 造成这种状况的一个原因可能是由于已经存在大量成熟的数学工具,这可能阻碍了社区自行开发 PHP 工具的工作。例如,我曾研究过一个功能强大的工具 S System,它拥有一组令人印象深刻的统计库,专门被设计成用来分析数据集,并且在 1998 年由于其语言设计而获得了 ACM 奖。如果 S 或者其开放源码同类 R 仅仅是一个 exec_shell 调用,那么为何还要麻烦用 PHP 实现相同的统计计算功能呢?有关 S System、它的 ACM 奖或 R 的更多信息,请参阅参考资料。 难道这不是在浪费开发人员的精力吗?如果开发 PHP 数学库的动机是出自节省开发人员的精力以及使用最好的工具来完成工作,那么 PHP 现在的课题是很有意义的。 另一方面,出于教学动机可能会鼓励对 PHP 数学库的开发。对于大约 10% 的人来说,数学是个值得探索的有趣课题。对于那些同时还熟练应用 PHP 的人来说,PHP 数学库的开发可以增强数学学习过程,换句话说,不要只阅读有关 T 测试的章节,还要实现一个能计算相应的中间值并用标准格式显示它们的类。 通过指导和训练,我希望证明开发 PHP 数学库并不是一项很难的任务,它可能代表一项有趣的技术和学习难题。在本文中,我将提供一个 PHP 数学库示例,名为 SimpleLinearRegression,它演示了一个可以用来开发 PHP 数学库的通用方法。让我们从讨论一些通用的原则开始,这些原则指导我开发这个 SimpleLinearRegression 类。 指导原则 我使用了六个通用原则来指导 SimpleLinearRegression 类的开发。 每个分析模型建立一个类。 使用逆向链接来开发类。 预计有大量的 getter。 存储中间结果。 为详细的 API 制定首选项。 尽善尽美并非目标。 让我们更详细地逐条研究这些指导方针。 每个分析模型建立一个类 每种主要的分析测试或过程应当有一个名称与测试或过程名相同的 PHP 类,这个类包含了输入函数、计算中间值和汇总值的函数和输出函数(将中间值和汇总值用文本或图形格式全部显示在屏幕上)。 使用逆向链接来开发类 在数学编程中,编码的目标通常是分析过程(比如 MultipleRegression、TimeSeries 或 ChiSquared)所希望生成的标准输出值。从解决问题的角度出发,这意味着您可以使用逆向链接来开发数学类的方法。 例如,汇总输出屏幕显示了一个或多个汇总统计结果。这些汇总统计结果依赖于中间统计结果的计算,这些中间统计结果又可能会涉及到更深一层的中间统计结果,以此类推。这个基于逆向链接的开发方法导出了下一个原则。 预计有大量的 getter 数学类的大部分类开发工作都涉及到计算中间值和汇总值。实际上,这意味着,如果您的类包含许多计算中间值和汇总值的 getter 方法,您不应当感到惊讶。 存储中间结果 将中间计算结果存储在结果对象内,这样您就可以将中间结果用作后续计算的输入。在 S 语言设计中实施了这一原则。在当前环境下,通过选择实例变量来表示计算得到的中间值和汇总结果,从而实施了该原则。 为详细的 API 制定首选项 当为 SimpleLinearRegression 类中的成员函数和实例变量制定命名方案时,我发现:如果我使用较长的名称(类似于 getSumSquaredError 这样的名称,而不是 getYY2)来描述成员函数和实例变量,那么就更容易了解函数的操作内容和变量所代表的意义。 我没有完全放弃简写名称;但是,当我用简写形式的名称时,我得设法提供注释以完整阐述该名称的含义。我的看法是:高度简写的命名方案在数学编程中很常见,但它们使得理解和证明某个数学例程是否按部就班更为困难,而原本不必造成此种困难。 尽善尽美并非目标 这个编码练习的目标不是一定要为 PHP 开发高度优化和严格的数学引擎。在早期阶段,应当强调学习实现意义重大的分析测试,以及解决这方面的难题。 实例变量 当对统计测试或过程进行建模时,您需要指出声明哪些实例变量。 实例变量的选择可以通过说明由分析过程生成的中间值和汇总值来确定。每个中间值和汇总值都可以有一个相应的实例变量,将变量的值作为对象属性。 我采用这样的分析来确定为清单 1 中的 SimpleLinearRegression 类声明哪些变量。可以对 MultipleRegression、ANOVA 或 TimeSeries 过程执行类似的分析。 清单 1. SimpleLinearRegression 类的实例变量 // 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 } ?> 构造函数 SimpleLinearRegression 类的构造函数方法接受一个 X 和一个 Y 向量,每个向量都有相同数量的值。您还可以为您预计的 Y 值设置一个缺省为 95% 的置信区间(confidence interval)。 构造函数方法从验证数据形式是否适合于处理开始。一旦输入向量通过了“大小相等”和“值大于 1”测试,就执行算法的核心部分。 执行这项任务涉及到通过一系列 getter 方法计算统计过程的中间值和汇总值。将每个方法调用的返回值赋给该类的一个实例变量。用这种方法存储计算结果确保了前后链接的计算中的调用例程可以使用中间值和汇总值。还可以通过调用该类的输出方法来显示这些结果,如清单 2 所描述的那样。 清单 2. 调用类输出方法 // 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; } ?> 方
推荐阅读
本文介绍如何利用Python中的Epoll机制构建一个高效的Web服务器,该服务器能够处理多个并发连接,并向每个连接的客户端返回预定义的响应文本。通过使用Epoll,服务器可以实现高性能的I/O多路复用。 ...
[详细]
蜡笔小新 2024-12-04 12:47:07
本文汇集了多个专注于PHP及后端开发领域的技术博客,包括知名的技术社区如SegmentFault和掘金等。这些资源对于提升技术水平、拓宽知识视野具有重要价值。技术博客作为学习过程中的辅助材料,其作用在于激发兴趣、提供灵感,但更关键的是建立坚实的技术基础和丰富的实践经验。 ...
[详细]
蜡笔小新 2024-12-04 22:53:18
安装MemcachedMemcached整理安装PythonMemcachedAPIpython操作啊Memcached使用Python-memcached模块下载安装:https ...
[详细]
蜡笔小新 2024-12-04 19:15:58
在Word中编辑复杂的数学公式常常让人感到头疼,尤其是处理偏微分方程(PDE)等高级数学内容时。然而,最近GitHub上的一个开源项目latexify_py展示了如何利用Python轻松生成LaTeX数学公式,极大地简化了这一过程。 ...
[详细]
蜡笔小新 2024-12-04 15:37:28
本文详细介绍了Java中常见的锁类型,包括乐观锁与悲观锁、独占锁与共享锁、互斥锁与读写锁、可重入锁、公平锁与非公平锁、分段锁、偏向锁、轻量级锁、重量级锁以及自旋锁。每种锁的特性、作用及适用场景均有所涉及。 ...
[详细]
蜡笔小新 2024-12-04 14:45:08
Django的数据库1.在Django_test下的view.py里面model定义模型fromdjango.dbimportmodels#Createyourmodelshere ...
[详细]
蜡笔小新 2024-12-04 11:29:56
本文旨在为信息安全爱好者提供一份详尽的成长指南,涵盖从学习心态调整到具体技能提升的各个方面。 ...
[详细]
蜡笔小新 2024-12-03 19:44:46
本文介绍了一个简单的Python函数,该函数能够接收一个日期作为输入,并返回这一天是星期几。此功能通过使用Python的datetime模块实现。 ...
[详细]
蜡笔小新 2024-12-03 17:26:40
当面对大量的Excel文件时,如何高效地将它们合并成一个文件成为了一项挑战。本文将指导初学者如何利用Python的几个库,在几十行代码内完成这一任务。 ...
[详细]
蜡笔小新 2024-12-03 12:29:23
本文深入探讨了OpenCV中的Canny边缘检测算法,并通过具体的Python代码实例展示了如何实现特定区域的轮廓线提取。适合初学者和专业人士参考。 ...
[详细]
蜡笔小新 2024-12-03 12:11:28
Python作为一种广泛使用的高级编程语言,以其简洁的语法、强大的功能和丰富的库支持著称。本文将详细介绍Python的主要特点及其在现代软件开发中的应用。 ...
[详细]
蜡笔小新 2024-12-03 12:00:39
导读上一篇讲了zsh的常用字符串操作,这篇开始讲更为琐碎的转义字符和格式化输出相关内容。包括转义字符、引号、print、printf的使用等等。其中很多内容没有必要记忆,作为手册参 ...
[详细]
蜡笔小新 2024-12-03 03:30:40
一个产品数组拼图|集合 2 (O(1)空间) ...
[详细]
蜡笔小新 2024-12-02 19:18:16
本文详细介绍了Python中常用的图像处理库,包括scikit-image、Numpy、Scipy、Pillow、OpenCV-Python、SimpleCV、Mahotas、SimpleITK、pgmagick和Pycairo,旨在帮助开发者和研究人员选择合适的工具进行图像处理任务。 ...
[详细]
蜡笔小新 2024-12-02 17:15:21
本文介绍了如何利用Python的Turtle库来绘制奥运五环。通过设置不同的颜色和位置,能够精确地模拟奥运标志。 ...
[详细]
蜡笔小新 2024-12-02 17:12:43