仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2503|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网页编程之PHP完成复杂线性回归之数据研讨东西

[复制链接]
金色的骷髅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:15:26 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
理解动态语言的概念,运做机制,熟悉PHP语法数据   概念

  复杂线性回归建模面前的根基方针是从成对的 X值和 Y值(即 XY丈量值)构成的二维立体中找到最吻合的直线。一旦用 最小方差法找到这条直线,就能够履行各类统计测试,以肯定这条直线与不雅测到的 Y值的偏离量吻合水平。

  线性方程( y = mx + b)有两个参数必需依据所供应的 XY数据预算出来,它们是斜率( m)和 y 轴截距( b)。一旦预算出这两个参数,就能够将不雅测值输出线性方程,并察看方程所生成的 Y展望值。

  要利用最小方差法预算出 mb参数,就要找到 m 和 b 的估量值,使它们关于一切的 X值失掉的 Y值的不雅测值和展望值最小。不雅测值和展望值之差称为误差( y i- (mx i+ b) ),而且,假如对每一个误差值都求平方,然后求这些残差的和,其了局是一个被称为 展望平方差的数。利用最小方差法来肯定最吻合的直线触及寻觅使展望方差最小的 mb的估量值。

  可以用两种根基办法来找到知足最小方差法的估量值 mb。第一种办法,可使用数值搜刮进程设定分歧的 mb值并对它们求值,终究决意发生最小方差的估量值。第二种办法是利用微积分找到用于预算 mb 的方程。我不盘算深切会商推导出这些方程所触及的微积分,但我的确在 SimpleLinearRegression 类中利用了这些剖析方程,以找到 mb 的最小平方估量值(请参阅 SimpleLinearRegression 类中的 getSlope() 和 getYIntercept 办法)。

  即便具有了可以用来找到 mb的最小平方估量值的方程,也其实不意味着只需将这些参数代入线性方程,其了局就是一条与数据优秀吻合的直线。这个复杂线性回归过程当中的下一步是肯定其他的展望方差是不是可以承受。

  可使用统计决议计划进程来否决“直线与数据吻合”这个备择假定。这个进程基于对 T 统计值的盘算,利用几率函数求得随机大的不雅测值的几率。正如第 1 局部所提到的, SimpleLinearRegression 类生成了为数浩瀚的汇总值,个中一个主要的汇总值是 T 统计值,它可以用来权衡线性方程与数据的吻合水平。假如吻合优秀,则 T 统计值常常是一个较大的值;假如 T 值很小,就应当用一个缺省模子取代您的线性方程,该模子假定 Y值的均匀值是最好展望值(由于一组值的均匀值凡是可所以下一个不雅测值的有效的展望值)。

  要测试 T 统计值是不是大到可以不必 Y值的均匀值作为最好展望值,需求盘算随机取得 T 统计值的几率。假如几率很低,那就能够不采取均匀值是最好展望值这一有效假定,而且响应地可以确信复杂线性模子是与数据优秀吻合的。(有关盘算 T 统计值几率的更多信息,请参阅第 1 局部。)

  回过火会商统计决议计划进程。它告知您什么时候不采取有效假定,却没有告知您是不是承受备择假定。在研讨情况中,需求经由过程实际参数和统计参数来创立线性模子备择假定。

  您将构建的数据研讨东西完成了用于线性模子(T 测试)的统计决议计划进程,并供应了可以用来机关实际和统计参数的汇总数据,这些参数是创立线性模子所需求的。数据研讨东西可以归类为决议计划撑持东西,供常识任务者在中小范围的数据集中研讨形式。

  从进修的角度来看,复杂线性回归建模值得研讨,由于它是了解更初级模式的统计建模的殊途同归。例如,复杂线性回归中的很多中心概念为了解屡次回归(Multiple Regression)、要素剖析(Factor Analysis)和工夫序列(Time Series)等创立了优秀的基本。

  复杂线性回偿还是一种多用处的建模手艺。经由过程转换原始数据(凡是用对数或幂转换),可以用它来为曲线数据建模。这些转换可使数据线性化,如许就能够利用复杂线性回归来为数据建模。所生成的线性模子将被暗示为与被转换值相干的线性公式。

  几率函数

  在前一篇文章中,我经由过程交由 R 来求得几率值,从而避开了用 PHP 完成几率函数的成绩。我对这个处理计划并不是完整写意,因而我入手下手研讨这个成绩:开辟基于 PHP 的几率函数需求些甚么。

  我入手下手上彀查找信息和代码。一个二者兼有的来历是书本 Numerical Recipes in C 中的几率函数。我用 PHP 从头完成了一些几率函数代码( gammln.c 和 betai.c 函数),但我对了局仍是不写意。与其它一些完成比拟,其代码仿佛多了些。另外,我还需求反几率函数。

  侥幸的是,我偶尔发明了 John Pezzullo 的 Interactive Statistical Calculation。John 关于 几率散布函数的网站上有我需求的一切函数,为便于进修,这些函数已用 JavaScript 完成。

  我将 Student T 和 Fisher F 函数移植到了 PHP。我对 API 作了一点修改,以便合适 Java 定名作风,并将一切函数嵌入到名为 Distribution 的类中。该完成的一个很棒的功效是 doCommonMath 办法,这个库中的一切函数都重用了它。我没有消费力量去完成的其它测试(正态测试和卡方测试)也都利用 doCommonMath 办法。

  此次移植的另外一个方面也值得注重。经由过程利用 JavaScript,用户可以将静态肯定的值赋给实例变量,比如:
  1. var PiD2 = pi() / 2
复制代码
  在 PHP 中不克不及如许做。只能把复杂的常量值赋给实例变量。但愿在 PHP5 中会处理这个缺点。

  请注重 清单 1中的代码并不决义实例变量 ― 这是由于在 JavaScript 版本中,它们是静态付与的值。

  清单 1. 完成几率函数
  1. <?php // Distribution.php // Copyright John Pezullo // Released under same terms as PHP. // PHP Port and OO'fying by Paul Meagher class Distribution { function doCommonMath($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; } function getStudentT($t, $df) { $t = abs($t); $w = $t / sqrt($df); $th = atan($w); if ($df == 1) { return 1 - $th / (pi() / 2); } $sth = sin($th); $cth = cos($th); if( ($df % 2) ==1 ) { return 1 - ($th + $sth * $cth * $this->doCommonMath($cth * $cth, 2, $df - 3, -1)) / (pi()/2); } else { return 1 - $sth * $this->doCommonMath($cth * $cth, 1, $df - 3, -1); } } function getInverseStudentT($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; } function getFisherF($f, $n1, $n2) { // implemented but not shown } function getInverseFisherF($p, $n1, $n2) { // implemented but not shown } } ?>
复制代码
[code]</p>
[1] [2] [3] [4] [5] 下一页  

  你的留言本应该加入注册以及分页功能了,而如果你更强的话,UI(用户界面)也可以加强,完成之后,感觉是不是特有成就感?不管怎么样,咱好歹是写了一个动态网站程序了,放在自己的网站上耍耍吧。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-22 01:55

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表