php实现简单线性回归之数据研究工具_php技巧

2008-02-23 05:44:50来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  概念

  简单线性回归建模背后的基本目标是从成对的 X值和 Y值(即 X和 Y测量值)组成的二维平面中找到最吻合的直线。一旦用 最小方差法找到这条直线,就能够执行各种统计测试,以确定这条直线和观测到的 Y值的偏离量吻合程度。

  线性方程( y = mx b)有两个参数必须根据所提供的 X和 Y数据估算出来,他们是斜率( m)和 y 轴截距( b)。一旦估算出这两个参数,就能够将观测值输入线性方程,并观察方程所生成的 Y预测值。

  要使用最小方差法估算出 m和 b参数,就要找到 m 和 b 的估计值,使他们对于任何的 X值得到的 Y值的观测值和预测值最小。观测值和预测值之差称为误差( y i- (mx i 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 测试)的统计决策过程,并提供了能够用来构造理论和统计参数的汇总数据,这些参数是建立线性模型所需要的。数据研究工具能够归类为决策支持工具,供知识工作者在中小规模的数据集中研究模式。

  从学习的角度来看,简单线性回归建模值得研究,因为他是理解更高级形式的统计建模的必由之路。例如,简单线性回归中的许多核心概念为理解多次回归(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,用户能够将动态确定的值赋给实例变量,譬如:


var PiD2 = pi() / 2

  在 PHP 中不能这样做。只能把简单的常量值赋给实例变量。希望在 PHP5 中会解决这个缺陷。

  请注意 清单 1中的代码并未定义实例变量 — 这是因为在 JavaScript 版本中,他们是动态赋予的值。

  清单 1. 实现概率函数


<?php

// Distribution.php

// Copyright John Pezullo
// Released under same terms as PHP.
// PHP Port and OOfying 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);

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 关于c#中枚举打印机_c#应用

下一篇: 自定义应用程式配置文档(app.config)_c#应用