简略线性回归建模背面的根本方针是从成对的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的类中。该完结的一个很棒的功用是doCommonMap办法,这个库中的一切函数都重用了它。我没有花费力气去完结的其它测验(正态测验和卡方测验)也都运用doCommonMap办法。
这次移植的另一个方面也值得注意。经过运用JavaScript,用户能够将动态确认的值赋给实例变量,比如:
varPiD2=pi()/2
在PHP中不能这样做。只能把简略的常量值赋给实例变量。期望在PHP5中会处理这个缺点。
请注意清单1中的代码并未界说实例变量—这是由于在JavaScript版别中,它们是动态赋予的值。
清单1.完结概率函数
<?php//Distribution.php//CopyrightJohnPezullo//ReleasedundersametermsasPHP.//PHPPortandOO'fyingbyPaulMeagherclassDistribution{functiondoCommonMap($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);$p=atan($w);if($df==1){return1-$p/(pi()/2);}$sp=sin($p);$cp=cos($p);if(($df%2)==1){return1-($p+$sp*$cp*$pis->doCommonMap($cp*$cp,2,$df-3,-1))/(pi()/2);}else{return1-$sp*$pis->doCommonMap($cp*$cp,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($pis->getStudentT($t,$df)>$p){$v=$v-$dv;}else{$v=$v+$dv;}}return$t;}functiongetFisherF($f,$n1,$n2){//implementedbutnotshown}functiongetInverseFisherF($p,$n1,$n2){//implementedbutnotshown}}?>#p#分页标题#e#
输出办法已然您现已用PHP完结了概率函数,那么开发依据PHP的数据研讨东西剩余的仅有难题便是规划用于显现剖析成果的办法。
简略的处理方案是依据需求将一切实例变量的值都显现到屏幕上。在榜首篇文章中,当显现燃耗研讨(BurnoutStudy)的线性方程、T值和T概率时,我便是这么做的。能依据特定意图而拜访特定值是很有协助的,SimpleLinearRegression支撑此类用法。
但是,另一种用于输出成果的办法是将输出的各部分系统化地进行分组。假如研讨用于回归剖析的首要核算软件包的输出,就会发现它们往往是用相同的办法对输出进行分组的。它们往往有摘要表(SummaryTable)、违背值剖析(AnalysisOfVariance)表、参数估计值(ParameterEstimate)表和R值(RValue)。相似地,我创立了一些输出办法,称号如下:
showSummaryTable()showAnalysisOfVariance()showParameterEstimates()showRValues()我还有一个用于显现线性猜测公式的办法(getFormula())。许多核算软件包不输出公式,而是期望用户依据上述办法的输出结构公式。部分是由于您终究用来对数据建模的公式的终究办法或许由于下列原因而与缺省公式不同:
Y轴截距没有有意义的解说,或许输入值或许是经过转化的,而您或许需求撤销对它们的转化以获取终究的解说。
一切这些办法都假定输出前言是页。考虑到您有或许期望用非页的其它前言输出这些汇总值,所以我决议将这些输出办法包装在一个承继了SimpleLinearRegression类的类中。清单2中的代码旨在演示输出类的通用逻辑。为了使通用逻辑更杰出,所以除去了完结各种show办法的代码。
清单2.演示输出类的通用逻辑
<?php//HTML.php//Copyright2003,PaulMeagher//DistributedunderGPLinclude_once"slr/SimpleLinearRegression.php";classSimpleLinearRegressionHTMLextendsSimpleLinearRegression{functionSimpleLinearRegressionHTML($X,$Y,$conf_int){SimpleLinearRegression::SimpleLinearRegression($X,$Y,$conf_int);}functionshowTableSummary($x_name,$y_name){}functionshowAnalysisOfVariance(){}functionshowParameterEstimates(){}functionshowFormula($x_name,$y_name){}functionshowRValues(){}}?>
这个类的结构函数仅仅SimpleLinearRegression类结构函数的包装器。这意味着假如您想显现SimpleLinearRegression剖析的HTML输出,则应该实例化SimpleLinearRegressionHTML类,而不是直接实例化SimpleLinearRegression类。其长处是不会有许多未运用的办法充满SimpleLinearRegression类,而且能够更自由地界说用于其它输出前言的类(或许会对不同前言类型完结同一API)。
图形输出
迄今为止,您现已完结的输出办法都以HTML格局显现汇总值。它也适合于用GIF、JPEG或PNG格局显现这些数据的散布图(scatterplot)或线图(lineplot)。
与其亲身编写生成线图和散布图的代码,我以为最好运用名为JpGraph的依据PHP的图形库。JpGraph正由JohanPersson活跃开发,其项目站这样描绘它:
无论是关于只要最少代码的“以方便但不恰当办法取得的”图形,仍是关于需求十分细粒度操控的杂乱专业图形,JpGraph都能够使它们的制作变得简略。JpGraph相同适用于科学和商业类型的图形。
JpGraph分发版中包含很多能够依据特定需求进行定制的示例脚本。将JpGraph用于数据研讨东西十分简略,只需找到功用与我的需求相似的示例脚本,然后对该脚本进行改写以满意我的特定需求即可。
清单3中的脚本是从样本数据研讨东西(explore.php)中抽取的,它演示了怎么调用该库以及怎么将来自于SimpleLinearRegression剖析的数据填入Line和Scatter类。这段代码中的注释是JohanPersson编写的(JPGraph代码库的文档化作业做得很好)。
清单3.来自于样本数据研讨东西explore.php的函数的具体内容
<?php//Snippetextractedfromexplore.phpscriptinclude("jpgraph/jpgraph.php");include("jpgraph/jpgraph_scatter.php");include("jpgraph/jpgraph_line.php");//Createpegraph$graph=newGraph(300,200,'auto');$graph->SetScale("linlin");//Setuptitle$graph->title->Set("$title");$graph->img->SetMargin(50,20,20,40);$graph->xaxis->SetTitle("$x_name","center");$graph->yaxis->SetTitleMargin(30);$graph->yaxis->title->Set("$y_name");$graph->title->SetFont(FF_FONT1,FS_BOLD);//makesurepatpeX-axisisalwaysatpe//bottomatpeplotandnotjustatY=0whichis//pedefaultposition$graph->xaxis->SetPos('min');//Createpescatterplotwipsomenicecolors$sp1=newScatterPlot($slr->Y,$slr->X);$sp1->mark->SetType(MARK_FILLEDCIRCLE);$sp1->mark->SetFillColor("red");$sp1->SetColor("blue");$sp1->SetWeight(3);$sp1->mark->SetWidp(4);//Createperegressionline$lplot=newLinePlot($slr->PredictedY,$slr->X);$lplot->SetWeight(2);$lplot->SetColor('navy');//Addpepltostopeline$graph->Add($sp1);$graph->Add($lplot);//...andstroke$graph_name="temp/test.png";$graph->Stroke($graph_name);?><imgsrc='<?phpecho$graph_name?>'vspace='15'>?>#p#分页标题#e#
数据研讨脚本该数据研讨东西由单个脚本(explore.php)构成,该脚本调用SimpleLinearRegressionHTML类和JpGraph库的办法。
该脚本运用了简略的处理逻辑。该脚本的榜首部分对所提交的表单数据履行根本验证。假如这些表单数据经过验证,则履行该脚本的第二部分。
该脚本的第二部分所包含的代码用于剖析数据,并以HTML和图形格局显现汇总成果。清单4中显现了explore.php脚本的根本结构:
清单4.explore.php的结构
<?php//explore.phpif(!empty($x_values)){$X=explode(",",$x_values);$numX=count($X);}if(!empty($y_values)){$Y=explode(",",$y_values);$numY=count($Y);}//displayentrydataentryformifvariablesnotsetif((empty($title))OR(empty($x_name))OR(empty($x_values))OR(empty($y_name))OR(empty($conf_int))OR(empty($y_values))OR($numX!=$numY)){//Omittedcodefordisplayingentryform}else{include_once"slr/SimpleLinearRegressionHTML.php";$slr=newSimpleLinearRegressionHTML($X,$Y,$conf_int);echo"<h2>$title</h2>";$slr->showTableSummary($x_name,$y_name);echo"<br><br>";$slr->showAnalysisOfVariance();echo"<br><br>";$slr->showParameterEstimates($x_name,$y_name);echo"<br>";$slr->showFormula($x_name,$y_name);echo"<br><br>";$slr->showRValues($x_name,$y_name);echo"<br>";include("jpgraph/jpgraph.php");include("jpgraph/jpgraph_scatter.php");include("jpgraph/jpgraph_line.php");//Thecodefordisplayingpegraphicsisinlineinpe//explore.phpscript.Thecodeforpesetwolineplots//finishesoffpescript://Omittedcodefordisplayingscatterpluslineplot//Omittedcodefordisplayingresidualsplot}?>#p#分页标题#e#
火灾丢失研讨为了演示怎么运用数据研讨东西,我将运用来自设想的火灾丢失研讨的数据。这个研讨将首要住宅区火灾丢失的金额与它们到最近消防站的间隔相关起来。例如,出于确认保险费的意图,保险公司会对这种联系的研讨感兴趣。
该研讨的数据如图1中的输入屏幕所示。
图1.显现研讨数据的输入屏幕
数据被提交之后,会对它进行剖析,并显现这些剖析的成果。榜首个显现的成果集是TableSummary,如图2所示。
图2.TableSummary是所显现的榜首个成果集
TableSummary以表格办法显现了输入数据和其它列,这些列指出了对应于观测值X的猜测值Y、Y值的猜测值和观测值之间的差以及猜测Y值置信区间的下限和上限。
图3显现了TableSummary之后的三个高档别数据汇总表。
图3.显现了TableSummary之后的三个高档别数据汇总表
AnalysisofVariance表显现了怎么将Y值的违背值归为两个首要的违背值来历,由模型解说的方差(请看Model行)和模型不能解说的方差(请看Error行)。较大的F值意味着该线性模型捕获了Y测量值中的大多数违背值。这个表在屡次回归环境中更有用,在那里每个独立变量都在表中占有一行。
ParameterEstimates表显现了预算的Y轴截距(Intercept)和斜率(Slope)。每行都包含一个T值以及观测到极限T值的概率(请看Prob>T列)。斜率的Prob>T可用于否决线性模型。
假如T值的概率大于0.05(或许是相似的小概率),那么您能够否决该无效假定,由于随机观测到极限值的或许性很小。不然您就有必要运用该无效假定。
在火灾丢失研讨中,随机取得巨细为12.57的T值的概率小于0.00000。这意味着关于与该研讨中观测到的X值区间相对应的Y值而言,线性模型是有用的猜测器(比Y值的平均值更好)。
终究陈述显现了相关性系数或R值。百度优化关键词"能够用它们来评价线性模型与数据的契合程度。高的R值标明契合杰出。
每个汇总陈述对有关线性模型和数据之间联系的各种剖析问题供给了答案。请查阅Hamilton、Neter或Pedhauzeur编写的教科书,以了解更高档的回归剖析处理。
要显现的终究陈述元素是数据的散布图和线图,如图4所示。
图4.终究陈述元素—散布图和线图
大多数人都了解线图(如本系列中的榜首幅图)的阐明,因而我将不对此进行注释,只想说JPGraph库能够发生用于Web的高质量科学图表。当您输入散布或直线数据时,它也做得很好。
第二幅图将残差(观测的Y、猜测的Y)与您猜测的Y值相关起来。这是研讨性数据剖析(ExploratoryDataAnalysis,EDA)的倡导者所运用的图形示例,用以协助将剖析人员对数据中的办法的检测和了解能力说到最高程度。行家能够运用这幅图答复关于下列方面的问题:
或许的非正常值或影响力过度的比如或许的曲线联系(运用转化?)非正态残差散布十分量差错方差或异方差性能够轻松地扩展这个数据研讨东西,以生成更多类型的图形—直方图、框图和四分位数图—这些都是规范的EDA东西。
数学库体系结构
对数学的业余爱好使我在最近几个月中保持着对数学库的浓厚兴趣。此类研讨推进我考虑怎么安排我的代码库以及使其预期在未来能不断增加。
我暂时选用清单5中的目录结构:
清单5.易于增加的目录结构
phpmap/burnout_study.phpexplore.phpfire_study.phpnavbar.phpdist/Distribution.phpfisher.phpstudent.phpsource.phpjpgraph/etc...slr/SimpleLinearRegression.phpSimpleLinearRegressionHTML.phptemp/
例如,未来有关屡次回归的作业,将触及扩展这个库以包含matrix目录,该目录用来包容履行矩阵操作(这是关于更高档办法的回归剖析的需求)的PHP代码。我还将创立一个mr目录,以包容完结屡次回归剖析输入办法、逻辑和输出办法的PHP代码。
请注意这个目录结构包含一个temp目录。有必要设置该目录的答应权,使explore.php脚本能够将输出图写到该目录。在测验装置phpmap_002.tar.gz源代码时请紧记这一点。此外,请在JpGraph项目站上阅览装置JpGraph的指示信息(请参阅参考资料)。
终究提一点,假如采纳以下作法,能够将一切软件类移到Web根目录之外的文档根目录:
使某个大局PHP_MATH变量有权拜访非Web根目录方位,而且保证在一切需求或包含的文件途径前面加上这个已界说的常量作为前缀。将来,对PHP_MATH变量的设置将经过一个用于整个PHP数学库的配置文件来完结。
您学到了什么?
在本文中,您了解了怎么运用SimpleLinearRegression类开发用于中小规划的数据集的数据研讨东西。在此进程中,我还开发了一个供SimpleLinearRegression类运用的本机概率函数,并用HTML输出办法和依据JpGraph库的图形生成代码扩展该类。
从学习的视点来看,简略线性回归建模是值得进一步研讨的,由于事实证明,它是了解更高档办法的核算建模的必经之路。在深化学习更高档的技能(如屡次回归或多变量方差剖析)之前,关于简略线性回归的透彻了解将使您收获颇丰。
即便简略线性回归只用一个变量来阐明或猜测另一个变量的违背值,在一切的研讨变量之间寻觅简略线性联系依然常常是研讨性数据剖析的榜首步。仅由于数据是多元的并不意味着就有必要运用多元东西研讨它。实际上,在开端时运用简略线性回归这样的根本东西是着手探求数据办法的好办法。
。内容来自:蜓云SEOtingclouds
免责声明:本站内容和图片由网友提供或来自网络。
如有违反到您的权益,请通知我们删除处理。文章仅代表作者本人的观点,与本站立场无关!
© 2023 nvsheng.cc 女生-个人图集收集 蜀ICP备2021006193号-3|川公网安备 51130202000403号
发表评论