用 PHP 實(shí)現(xiàn)的簡(jiǎn)單線性回歸(二)
Jun 21, 2016 am 09:14 AM解決輸出和概率函數(shù)缺陷的數(shù)據(jù)研究工具
本系列文章的第 1 部分結(jié)尾處提到了簡(jiǎn)單線性回歸(Simple Linear Regression)類(lèi)中缺少的三個(gè)元素。在本文中,作者 Paul Meagher 用基于 PHP 的概率函數(shù)彌補(bǔ)了這些缺陷,演示了如何將輸出方法集成到 SimpleLinearRegression 類(lèi)中并創(chuàng)建了圖形輸出。他通過(guò)構(gòu)建數(shù)據(jù)研究工具解決了這些問(wèn)題,該工具旨在深層次地研究中小規(guī)模的數(shù)據(jù)集所包含的信息。(在第 1 部分中,作者演示了如何用 PHP 作為實(shí)現(xiàn)語(yǔ)言來(lái)開(kāi)發(fā)和實(shí)現(xiàn)簡(jiǎn)單線性回歸算法包的核心部分。)
在這個(gè)由兩部分組成的系列文章的第 1 部分(“用 PHP 實(shí)現(xiàn)的簡(jiǎn)單線性回歸”)中,我說(shuō)明了數(shù)學(xué)庫(kù)對(duì) PHP 有用的原因。我還演示了如何用 PHP 作為實(shí)現(xiàn)語(yǔ)言來(lái)開(kāi)發(fā)和實(shí)現(xiàn)簡(jiǎn)單線性回歸算法的核心部分。
本文的目標(biāo)是向您展示如何使用第 1 部分中討論的 SimpleLinearRegression 類(lèi)來(lái)構(gòu)建一個(gè)重要的數(shù)據(jù)研究工具。
簡(jiǎn)要回顧:概念
簡(jiǎn)單線性回歸建模背后的基本目標(biāo)是從成對(duì)的 X 值和 Y 值(即 X 和 Y 測(cè)量值)組成的二維平面中找到最吻合的直線。一旦用最小方差法找到這條直線,就可以執(zhí)行各種統(tǒng)計(jì)測(cè)試,以確定這條直線與觀測(cè)到的 Y 值的偏離量吻合程度。
線性方程(y = mx + b)有兩個(gè)參數(shù)必須根據(jù)所提供的 X 和 Y 數(shù)據(jù)估算出來(lái),它們是斜率(m)和 y 軸截距(b)。一旦估算出這兩個(gè)參數(shù),就可以將觀測(cè)值輸入線性方程,并觀察方程所生成的 Y 預(yù)測(cè)值。
要使用最小方差法估算出 m 和 b 參數(shù),就要找到 m 和 b 的估計(jì)值,使它們對(duì)于所有的 X 值得到的 Y 值的觀測(cè)值和預(yù)測(cè)值最小。觀測(cè)值和預(yù)測(cè)值之差稱為誤差(yi - (mxi + b)),并且,如果對(duì)每個(gè)誤差值都求平方,然后求這些殘差的和,其結(jié)果是一個(gè)被稱為預(yù)測(cè)平方差的數(shù)。使用最小方差法來(lái)確定最吻合的直線涉及尋找使預(yù)測(cè)方差最小的 m 和 b 的估計(jì)值。
可以用兩種基本方法來(lái)找到滿足最小方差法的估計(jì)值 m 和 b。第一種方法,可以使用數(shù)值搜索過(guò)程設(shè)定不同的 m 和 b 值并對(duì)它們求值,最終決定產(chǎn)生最小方差的估計(jì)值。第二種方法是使用微積分找到用于估算 m 和 b 的方程。我不打算深入討論推導(dǎo)出這些方程所涉及的微積分,但我確實(shí)在 SimpleLinearRegression 類(lèi)中使用了這些分析方程,以找到 m 和 b 的最小平方估計(jì)值(請(qǐng)參閱 SimpleLinearRegression 類(lèi)中的 getSlope() 和 getYIntercept 方法)。
即使擁有了可以用來(lái)找到 m 和 b 的最小平方估計(jì)值的方程,也并不意味著只要將這些參數(shù)代入線性方程,其結(jié)果就是一條與數(shù)據(jù)良好吻合的直線。這個(gè)簡(jiǎn)單線性回歸過(guò)程中的下一步是確定其余的預(yù)測(cè)方差是否可以接受。
可以使用統(tǒng)計(jì)決策過(guò)程來(lái)否決“直線與數(shù)據(jù)吻合”這個(gè)備擇假設(shè)。這個(gè)過(guò)程基于對(duì) T 統(tǒng)計(jì)值的計(jì)算,使用概率函數(shù)求得隨機(jī)大的觀測(cè)值的概率。正如第 1 部分所提到的,SimpleLinearRegression 類(lèi)生成了為數(shù)眾多的匯總值,其中一個(gè)重要的匯總值是 T 統(tǒng)計(jì)值,它可以用來(lái)衡量線性方程與數(shù)據(jù)的吻合程度。如果吻合良好,則 T 統(tǒng)計(jì)值往往是一個(gè)較大的值;如果 T 值很小,就應(yīng)該用一個(gè)缺省模型代替您的線性方程,該模型假定 Y 值的平均值是最佳預(yù)測(cè)值(因?yàn)橐唤M值的平均值通??梢允窍乱粋€(gè)觀測(cè)值的有用的預(yù)測(cè)值)。
要測(cè)試 T 統(tǒng)計(jì)值是否大到可以不用 Y 值的平均值作為最佳預(yù)測(cè)值,需要計(jì)算隨機(jī)獲得 T 統(tǒng)計(jì)值的概率。如果概率很低,那就可以不采用平均值是最佳預(yù)測(cè)值這一無(wú)效假設(shè),并且相應(yīng)地可以確信簡(jiǎn)單線性模型是與數(shù)據(jù)良好吻合的。(有關(guān)計(jì)算 T 統(tǒng)計(jì)值概率的更多信息,請(qǐng)參閱第 1 部分。)
回過(guò)頭討論統(tǒng)計(jì)決策過(guò)程。它告訴您何時(shí)不采用無(wú)效假設(shè),卻沒(méi)有告訴您是否接受備擇假設(shè)。在研究環(huán)境中,需要通過(guò)理論參數(shù)和統(tǒng)計(jì)參數(shù)來(lái)建立線性模型備擇假設(shè)。
您將構(gòu)建的數(shù)據(jù)研究工具實(shí)現(xiàn)了用于線性模型(T 測(cè)試)的統(tǒng)計(jì)決策過(guò)程,并提供了可以用來(lái)構(gòu)造理論和統(tǒng)計(jì)參數(shù)的匯總數(shù)據(jù),這些參數(shù)是建立線性模型所需要的。數(shù)據(jù)研究工具可以歸類(lèi)為決策支持工具,供知識(shí)工作者在中小規(guī)模的數(shù)據(jù)集中研究模式。
從學(xué)習(xí)的角度來(lái)看,簡(jiǎn)單線性回歸建模值得研究,因?yàn)樗抢斫飧呒?jí)形式的統(tǒng)計(jì)建模的必由之路。例如,簡(jiǎn)單線性回歸中的許多核心概念為理解多次回歸(Multiple Regression)、要素分析(Factor Analysis)和時(shí)間序列(Time Series)等建立了良好的基礎(chǔ)。
簡(jiǎn)單線性回歸還是一種多用途的建模技術(shù)。通過(guò)轉(zhuǎn)換原始數(shù)據(jù)(通常用對(duì)數(shù)或冪轉(zhuǎn)換),可以用它來(lái)為曲線數(shù)據(jù)建模。這些轉(zhuǎn)換可以使數(shù)據(jù)線性化,這樣就可以使用簡(jiǎn)單線性回歸來(lái)為數(shù)據(jù)建模。所生成的線性模型將被表示為與被轉(zhuǎn)換值相關(guān)的線性公式。
概率函數(shù)
在前一篇文章中,我通過(guò)交由 R 來(lái)求得概率值,從而避開(kāi)了用 PHP 實(shí)現(xiàn)概率函數(shù)的問(wèn)題。我對(duì)這個(gè)解決方案并非完全滿意,因此我開(kāi)始研究這個(gè)問(wèn)題:開(kāi)發(fā)基于 PHP 的概率函數(shù)需要些什么。
我開(kāi)始上網(wǎng)查找信息和代碼。一個(gè)兩者兼有的來(lái)源是書(shū)籍 [url=http://www.library.cornell.edu/nr/bookcpdf.html]Numerical Recipes in C [/url] 中的概率函數(shù)。我用 PHP 重新實(shí)現(xiàn)了一些概率函數(shù)代碼(gammln.c 和 betai.c 函數(shù)),但我對(duì)結(jié)果還是不滿意。與其它一些實(shí)現(xiàn)相比,其代碼似乎多了些。此外,我還需要反概率函數(shù)。
幸運(yùn)的是,我偶然發(fā)現(xiàn)了 John Pezzullo 的 Interactive Statistical Calculation。John 關(guān)于概率分布函數(shù)的網(wǎng)站上有我需要的所有函數(shù),為便于學(xué)習(xí),這些函數(shù)已用 JavaScript 實(shí)現(xiàn)。
我將 Student T 和 Fisher F 函數(shù)移植到了 PHP。我對(duì) API 作了一點(diǎn)改動(dòng),以便符合 Java 命名風(fēng)格,并將所有函數(shù)嵌入到名為 Distribution 的類(lèi)中。該實(shí)現(xiàn)的一個(gè)很棒的功能是 doCommonMath 方法,這個(gè)庫(kù)中的所有函數(shù)都重用了它。我沒(méi)有花費(fèi)力氣去實(shí)現(xiàn)的其它測(cè)試(正態(tài)測(cè)試和卡方測(cè)試)也都使用 doCommonMath 方法。
這次移植的另一個(gè)方面也值得注意。通過(guò)使用 JavaScript,用戶可以將動(dòng)態(tài)確定的值賦給實(shí)例變量,譬如:
var PiD2 = pi() / 2
在 PHP 中不能這樣做。只能把簡(jiǎn)單的常量值賦給實(shí)例變量。希望在 PHP5 中會(huì)解決這個(gè)缺陷。
請(qǐng)注意清單 1 中的代碼并未定義實(shí)例變量 — 這是因?yàn)樵?JavaScript 版本中,它們是動(dòng)態(tài)賦予的值。
清單 1. 實(shí)現(xiàn)概率函數(shù)
// 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 $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
}
}
?>
輸出方法
既然您已經(jīng)用 PHP 實(shí)現(xiàn)了概率函數(shù),那么開(kāi)發(fā)基于 PHP 的數(shù)據(jù)研究工具剩下的唯一難題就是設(shè)計(jì)用于顯示分析結(jié)果的方法。
簡(jiǎn)單的解決方案是根據(jù)需要將所有實(shí)例變量的值都顯示到屏幕上。在第一篇文章中,當(dāng)顯示燃耗研究(Burnout Study)的線性方程、T 值和 T 概率時(shí),我就是這么做的。能根據(jù)特定目的而訪問(wèn)特定值是很有幫助的,SimpleLinearRegression 支持此類(lèi)用法。
然而,另一種用于輸出結(jié)果的方法是將輸出的各部分系統(tǒng)化地進(jìn)行分組。如果研究用于回歸分析的主要統(tǒng)計(jì)軟件包的輸出,就會(huì)發(fā)現(xiàn)它們往往是用同樣的方式對(duì)輸出進(jìn)行分組的。它們往往有摘要表(Summary Table)、偏離值分析(Analysis Of Variance)表、參數(shù)估計(jì)值(Parameter Estimate)表和 R 值(R Value)。類(lèi)似地,我創(chuàng)建了一些輸出方法,名稱如下:
showSummaryTable()
showAnalysisOfVariance()
showParameterEstimates()
showRValues()
我還有一個(gè)用于顯示線性預(yù)測(cè)公式的方法(getFormula())。許多統(tǒng)計(jì)軟件包不輸出公式,而是希望用戶根據(jù)上述方法的輸出構(gòu)造公式。部分是由于您最后用來(lái)對(duì)數(shù)據(jù)建模的公式的最終形式可能由于下列原因而與缺省公式不同:
1.Y 軸截距沒(méi)有有意義的解釋
2.或者輸入值可能是經(jīng)過(guò)轉(zhuǎn)換的,而您可能需要取消對(duì)它們的轉(zhuǎn)換以獲取最終的解釋。
所有這些方法都假定輸出媒介是網(wǎng)頁(yè)。考慮到您有可能希望用非網(wǎng)頁(yè)的其它媒介輸出這些匯總值,所以我決定將這些輸出方法包裝在一個(gè)繼承了 SimpleLinearRegression 類(lèi)的類(lèi)中。清單 2 中的代碼旨在演示輸出類(lèi)的通用邏輯。為了使通用邏輯更突出,所以除去了實(shí)現(xiàn)各種 show 方法的代碼。
清單 2. 演示輸出類(lèi)的通用邏輯
// HTML.php
// Copyright 2003, Paul Meagher
// Distributed under GPL
include_once "slr/SimpleLinearRegression.php";
class SimpleLinearRegressionHTML extends SimpleLinearRegression {
function SimpleLinearRegressionHTML($X, $Y, $conf_int) {
SimpleLinearRegression::SimpleLinearRegression($X, $Y, $conf_int);
}
function showTableSummary($x_name, $y_name) { }
function showAnalysisOfVariance() { }
function showParameterEstimates() { }
function showFormula($x_name, $y_name) { }
function showRValues() {}
}
?>
這個(gè)類(lèi)的構(gòu)造函數(shù)只是 SimpleLinearRegression 類(lèi)構(gòu)造函數(shù)的包裝器。這意味著如果您想顯示 SimpleLinearRegression 分析的 HTML 輸出,則應(yīng)該實(shí)例化 SimpleLinearRegressionHTML 類(lèi),而不是直接實(shí)例化 SimpleLinearRegression 類(lèi)。其優(yōu)點(diǎn)是不會(huì)有許多未使用的方法充斥 SimpleLinearRegression 類(lèi),并且可以更自由地定義用于其它輸出媒介的類(lèi)(也許會(huì)對(duì)不同媒介類(lèi)型實(shí)現(xiàn)同一 API)。
圖形輸出
迄今為止,您已經(jīng)實(shí)現(xiàn)的輸出方法都以 HTML 格式顯示匯總值。它也適合于用 GIF、JPEG 或 PNG 格式顯示這些數(shù)據(jù)的分布圖(scatter plot)或線圖(line plot)。
與其親自編寫(xiě)生成線圖和分布圖的代碼,我認(rèn)為最好使用名為 JpGraph 的基于 PHP 的圖形庫(kù)。JpGraph 正由 Johan Persson 積極開(kāi)發(fā),其項(xiàng)目網(wǎng)站這樣描述它:
無(wú)論是對(duì)于只有最少代碼的“以快捷但不恰當(dāng)方式獲得的”圖形,還是對(duì)于需要非常細(xì)粒度控制的復(fù)雜專(zhuān)業(yè)圖形,JpGraph 都可以使它們的繪制變得簡(jiǎn)單。JpGraph 同樣適用于科學(xué)和商業(yè)類(lèi)型的圖形。
JpGraph 分發(fā)版中包含大量可以根據(jù)特定需求進(jìn)行定制的示例腳本。將 JpGraph 用于數(shù)據(jù)研究工具非常簡(jiǎn)單,只需找到功能與我的需求類(lèi)似的示例腳本,然后對(duì)該腳本進(jìn)行改寫(xiě)以滿足我的特定需求即可。
清單 3 中的腳本是從樣本數(shù)據(jù)研究工具(explore.php)中抽取的,它演示了如何調(diào)用該庫(kù)以及如何將來(lái)自于 SimpleLinearRegression 分析的數(shù)據(jù)填入 Line 和 Scatter 類(lèi)。這段代碼中的注釋是 Johan Persson 編寫(xiě)的(JPGraph 代碼庫(kù)的文檔化工作做得很好)。
清單 3. 來(lái)自于樣本數(shù)據(jù)研究工具 explore.php 的函數(shù)的詳細(xì)內(nèi)容
// Snippet extracted from explore.php script
include ("jpgraph/jpgraph.php");
include ("jpgraph/jpgraph_scatter.php");
include ("jpgraph/jpgraph_line.php");
// Create the graph
$graph = new Graph(300,200,'auto');
$graph->SetScale("linlin");
// Setup title
$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);
// make sure that the X-axis is always at the
// bottom at the plot and not just at Y=0 which is
// the default position
$graph->xaxis->SetPos('min');
// Create the scatter plot with some nice colors
$sp1 = new ScatterPlot($slr->Y, $slr->X);
$sp1->mark->SetType(MARK_FILLEDCIRCLE);
$sp1->mark->SetFillColor("red");
$sp1->SetColor("blue");
$sp1->SetWeight(3);
$sp1->mark->SetWidth(4);
// Create the regression line
$lplot = new LinePlot($slr->PredictedY, $slr->X);
$lplot->SetWeight(2);
$lplot->SetColor('navy');
// Add the pltos to the line
$graph->Add($sp1);
$graph->Add($lplot);
// ... and stroke
$graph_name = "temp/test.png";
$graph->Stroke($graph_name);
?> ' vspace='15'>
?>
數(shù)據(jù)研究腳本
該數(shù)據(jù)研究工具由單個(gè)腳本(explore.php)構(gòu)成,該腳本調(diào)用 SimpleLinearRegressionHTML 類(lèi)和 JpGraph 庫(kù)的方法。
該腳本使用了簡(jiǎn)單的處理邏輯。該腳本的第一部分對(duì)所提交的表單數(shù)據(jù)執(zhí)行基本驗(yàn)證。如果這些表單數(shù)據(jù)通過(guò)驗(yàn)證,則執(zhí)行該腳本的第二部分。
該腳本的第二部分所包含的代碼用于分析數(shù)據(jù),并以 HTML 和圖形格式顯示匯總結(jié)果。清單 4 中顯示了 explore.php 腳本的基本結(jié)構(gòu):
清單 4. explore.php 的結(jié)構(gòu)
// explore.php
if (!empty($x_values)) {
$X = explode(",", $x_values);
$numX = count($X);
}
if (!empty($y_values)) {
$Y = explode(",", $y_values);
$numY = count($Y);
}
// display entry data entry form if variables not set
if ( (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) ) {
// Omitted code for displaying entry form
} else {
include_once "slr/SimpleLinearRegressionHTML.php";
$slr = new SimpleLinearRegressionHTML($X, $Y, $conf_int);
echo "
$title
";$slr->showTableSummary($x_name, $y_name);
echo "
";
$slr->showAnalysisOfVariance();
echo "
";
$slr->showParameterEstimates($x_name, $y_name);
echo "
";
$slr->showFormula($x_name, $y_name);
echo "
";
$slr->showRValues($x_name, $y_name);
echo "
";
include ("jpgraph/jpgraph.php");
include ("jpgraph/jpgraph_scatter.php");
include ("jpgraph/jpgraph_line.php");
// The code for displaying the graphics is inline in the
// explore.php script. The code for these two line plots
// finishes off the script:
// Omitted code for displaying scatter plus line plot
// Omitted code for displaying residuals plot
}
?>
火災(zāi)損失研究
為了演示如何使用數(shù)據(jù)研究工具,我將使用來(lái)自假想的火災(zāi)損失研究的數(shù)據(jù)。這個(gè)研究將主要住宅區(qū)火災(zāi)損失的金額與它們到最近消防站的距離關(guān)聯(lián)起來(lái)。例如,出于確定保險(xiǎn)費(fèi)的目的,保險(xiǎn)公司會(huì)對(duì)這種關(guān)系的研究感興趣。
該研究的數(shù)據(jù)如圖 1 中的輸入屏幕所示。
圖 1. 顯示研究數(shù)據(jù)的輸入屏幕
數(shù)據(jù)被提交之后,會(huì)對(duì)它進(jìn)行分析,并顯示這些分析的結(jié)果。第一個(gè)顯示的結(jié)果集是 Table Summary,如圖 2 所示。
圖 2. Table Summary 是所顯示的第一個(gè)結(jié)果集
Table Summary 以表格形式顯示了輸入數(shù)據(jù)和其它列,這些列指出了對(duì)應(yīng)于觀測(cè)值 X 的預(yù)測(cè)值 Y、Y 值的預(yù)測(cè)值和觀測(cè)值之間的差以及預(yù)測(cè) Y 值置信區(qū)間的下限和上限。
圖 3 顯示了 Table Summary 之后的三個(gè)高級(jí)別數(shù)據(jù)匯總表。
圖 3. 顯示了 Table Summary 之后的三個(gè)高級(jí)別數(shù)據(jù)匯總表
Analysis of Variance 表顯示了如何將 Y 值的偏離值歸為兩個(gè)主要的偏離值來(lái)源,由模型解釋的方差(請(qǐng)看 Model 行)和模型不能解釋的方差(請(qǐng)看 Error 行)。較大的 F 值意味著該線性模型捕獲了 Y 測(cè)量值中的大多數(shù)偏離值。這個(gè)表在多次回歸環(huán)境中更有用,在那里每個(gè)獨(dú)立變量都在表中占有一行。
Parameter Estimates 表顯示了估算的 Y 軸截距(Intercept)和斜率(Slope)。每行都包括一個(gè) T 值以及觀測(cè)到極限 T 值的概率(請(qǐng)看 Prob > T 列)。斜率的 Prob > T 可用于否決線性模型。
如果 T 值的概率大于 0.05(或者是類(lèi)似的小概率),那么您可以否決該無(wú)效假設(shè),因?yàn)殡S機(jī)觀測(cè)到極限值的可能性很小。否則您就必須使用該無(wú)效假設(shè)。
在火災(zāi)損失研究中,隨機(jī)獲得大小為 12.57 的 T 值的概率小于 0.00000。這意味著對(duì)于與該研究中觀測(cè)到的 X 值區(qū)間相對(duì)應(yīng)的 Y 值而言,線性模型是有用的預(yù)測(cè)器(比 Y 值的平均值更好)。
最終報(bào)告顯示了相關(guān)性系數(shù)或 R 值??梢杂盟鼈儊?lái)評(píng)估線性模型與數(shù)據(jù)的吻合程度。高的 R 值表明吻合良好。
每個(gè)匯總報(bào)告對(duì)有關(guān)線性模型和數(shù)據(jù)之間關(guān)系的各種分析問(wèn)題提供了答案。請(qǐng)查閱 Hamilton、Neter 或 Pedhauzeur 編寫(xiě)的教科書(shū),以了解更高級(jí)的回歸分析處理(請(qǐng)參閱參考資料)。
要顯示的最終報(bào)告元素是數(shù)據(jù)的分布圖和線圖,如圖 4 所示。
圖 4. 最終報(bào)告元素 — 分布圖和線圖
大多數(shù)人都熟悉線圖(如本系列中的第一幅圖)的說(shuō)明,因此我將不對(duì)此進(jìn)行注釋?zhuān)幌胝f(shuō) JPGraph 庫(kù)可以產(chǎn)生用于 Web 的高質(zhì)量科學(xué)圖表。當(dāng)您輸入分布或直線數(shù)據(jù)時(shí),它也做得很好。
第二幅圖將殘差(觀測(cè)的 Y、預(yù)測(cè)的 Y)與您預(yù)測(cè)的 Y 值關(guān)聯(lián)起來(lái)。這是研究性數(shù)據(jù)分析(Exploratory Data Analysis,EDA)的倡導(dǎo)者所使用的圖形示例,用以幫助將分析人員對(duì)數(shù)據(jù)中的模式的檢測(cè)和理解能力提到最高程度。行家可以使用這幅圖回答關(guān)于下列方面的問(wèn)題:
可能的非正常值或影響力過(guò)度的例子
可能的曲線關(guān)系(使用轉(zhuǎn)換?)
非正態(tài)殘差分布
非常量誤差方差或異方差性
可以輕松地?cái)U(kuò)展這個(gè)數(shù)據(jù)研究工具,以生成更多類(lèi)型的圖形 — 直方圖、框圖和四分位數(shù)圖 — 這些都是標(biāo)準(zhǔn)的 EDA 工具。
數(shù)學(xué)庫(kù)體系結(jié)構(gòu)
對(duì)數(shù)學(xué)的業(yè)余愛(ài)好使我在最近幾個(gè)月中保持著對(duì)數(shù)學(xué)庫(kù)的濃厚興趣。此類(lèi)研究推動(dòng)我思考如何組織我的代碼庫(kù)以及使其預(yù)期在未來(lái)能不斷增長(zhǎng)。
我暫時(shí)采用清單 5 中的目錄結(jié)構(gòu):
清單 5. 易于增長(zhǎng)的目錄結(jié)構(gòu)
phpmath/
burnout_study.php
explore.php
fire_study.php
navbar.php
dist/
Distribution.php
fisher.php
student.php
source.php
jpgraph/
etc...
slr/
SimpleLinearRegression.php
SimpleLinearRegressionHTML.php
temp/
例如,未來(lái)有關(guān)多次回歸的工作,將涉及擴(kuò)展這個(gè)庫(kù)以包括 matrix 目錄,該目錄用來(lái)容納執(zhí)行矩陣操作(這是對(duì)于更高級(jí)形式的回歸分析的需求)的 PHP 代碼。我還將創(chuàng)建一個(gè) mr 目錄,以容納實(shí)現(xiàn)多次回歸分析輸入方法、邏輯和輸出方法的 PHP 代碼。
請(qǐng)注意這個(gè)目錄結(jié)構(gòu)包含一個(gè) temp 目錄。必須設(shè)置該目錄的許可權(quán),使 explore.php 腳本能夠?qū)⑤敵鰣D寫(xiě)到該目錄。在嘗試安裝 phpmath_002.tar.gz 源代碼時(shí)請(qǐng)牢記這一點(diǎn)。此外,請(qǐng)?jiān)?JpGraph 項(xiàng)目網(wǎng)站上閱讀安裝 JpGraph 的指示信息(請(qǐng)參閱參考資料)。
最后提一點(diǎn),如果采取以下作法,可以將所有軟件類(lèi)移到 Web 根目錄之外的文檔根目錄:
使某個(gè)全局 PHP_MATH 變量有權(quán)訪問(wèn)非 Web 根目錄位置,并且
確保在所有需要或包括的文件路徑前面加上這個(gè)已定義的常量作為前綴。
將來(lái),對(duì) PHP_MATH 變量的設(shè)置將通過(guò)一個(gè)用于整個(gè) PHP 數(shù)學(xué)庫(kù)的配置文件來(lái)完成。
您學(xué)到了什么?
在本文中,您了解了如何使用 SimpleLinearRegression 類(lèi)開(kāi)發(fā)用于中小規(guī)模的數(shù)據(jù)集的數(shù)據(jù)研究工具。在此過(guò)程中,我還開(kāi)發(fā)了一個(gè)供 SimpleLinearRegression 類(lèi)使用的本機(jī)概率函數(shù),并用 HTML 輸出方法和基于 JpGraph 庫(kù)的圖形生成代碼擴(kuò)展該類(lèi)。
從學(xué)習(xí)的角度來(lái)看,簡(jiǎn)單線性回歸建模是值得進(jìn)一步研究的,因?yàn)槭聦?shí)證明,它是理解更高級(jí)形式的統(tǒng)計(jì)建模的必由之路。在深入學(xué)習(xí)更高級(jí)的技術(shù)(如多次回歸或多變量方差分析)之前,對(duì)于簡(jiǎn)單線性回歸的透徹理解將使您受益匪淺。
即使簡(jiǎn)單線性回歸只用一個(gè)變量來(lái)說(shuō)明或預(yù)測(cè)另一個(gè)變量的偏離值,在所有的研究變量之間尋找簡(jiǎn)單線性關(guān)系仍然常常是研究性數(shù)據(jù)分析的第一步。僅因?yàn)閿?shù)據(jù)是多元的并不意味著就必須使用多元工具研究它。實(shí)際上,在開(kāi)始時(shí)使用簡(jiǎn)單線性回歸這樣的基本工具是著手探究數(shù)據(jù)模式的好方法。
本系列研究了簡(jiǎn)單線性回歸分析的兩個(gè)應(yīng)用。在本文中,我研究了“到消防站的距離”和“火災(zāi)損失”之間的強(qiáng)線性關(guān)系。在第一篇文章中,我研究了“社會(huì)集中度”和稱為“消耗指數(shù)”的測(cè)量值之間的線性關(guān)系,盡管這種關(guān)系相對(duì)弱一些,但仍然十分明顯。(作為練習(xí),用本文中討論的數(shù)據(jù)研究工具重新研究第一個(gè)研究案例中較為凌亂的數(shù)據(jù)可能會(huì)很有趣。您可能會(huì)注意到 y 軸截距是負(fù)數(shù)的情況,這意味著“社會(huì)集中度”為 0,預(yù)測(cè)消耗指數(shù)為 -29.50。這有意義嗎?在對(duì)一種現(xiàn)象建模時(shí),您應(yīng)該問(wèn)問(wèn)自己:方程是否應(yīng)該包含可選的 y 軸截距,如果可以,那么該 y 軸截距在線性方程中會(huì)起什么作用。)
對(duì)于簡(jiǎn)單線性回歸的進(jìn)一步研究可能包括對(duì)這些主題的研究:
*如果想從您的方程以及可以使用的其它計(jì)算公式中略去截距,則何時(shí)可以這樣做
*何時(shí)以及如何使用冪、對(duì)數(shù)和其它轉(zhuǎn)換來(lái)對(duì)數(shù)據(jù)進(jìn)行線性化,以便用簡(jiǎn)單線性回歸來(lái)對(duì)該數(shù)據(jù)建模
*可以用來(lái)評(píng)估您的建模假設(shè)的充分性,并可以更清晰地洞察數(shù)據(jù)中的模式的其它可視化方法
這些是有待學(xué)習(xí)簡(jiǎn)單線性回歸的學(xué)生研究的一部分更高級(jí)的主題。參考資料包含了幾個(gè)指向高級(jí)主題文章的鏈接,您可以從中參考更多關(guān)于回歸分析的信息。
標(biāo)準(zhǔn) PHP 安裝提供了開(kāi)發(fā)基于數(shù)學(xué)的重要應(yīng)用程序所必須的許多資源。我希望這個(gè)系列的文章能啟發(fā)其他開(kāi)發(fā)人員出于樂(lè)趣、技術(shù)或?qū)W習(xí)挑戰(zhàn)的目的而用 PHP 來(lái)實(shí)現(xiàn)數(shù)學(xué)例程。
相關(guān)附件:本文所用源代碼下載
參考資料
1.請(qǐng)參考由 James T. McClave 和 Terry Sincich 編著的廣受歡迎的大學(xué)教科書(shū) Statistics,第 9 版(Prentice-Hall,在線),本文中所使用的算法步驟和“燃耗研究”示例參考了該書(shū)。
2.請(qǐng)查閱 PEAR 資源庫(kù),它目前包含了少量低級(jí)別的 PHP 數(shù)學(xué)類(lèi)。最終,應(yīng)該會(huì)很高興地看到 PEAR 包含實(shí)現(xiàn)標(biāo)準(zhǔn)的較高級(jí)別的數(shù)值方法(比如 SimpleLinearRegression、MultipleRegression、TimeSeries、ANOVA、FactorAnalysis、FourierAnalysis 及其它)的包。
3.查看作者的 SimpleLinearRegression 類(lèi)的所有源代碼。
4.了解一下Numerical Python 項(xiàng)目,它用非常科學(xué)的數(shù)組語(yǔ)言以及成熟的建立下標(biāo)方法擴(kuò)展了 Python。有了該擴(kuò)展,數(shù)學(xué)操作就非常接近人們期望從編譯語(yǔ)言所獲得的功能。
5.研究可用于 Perl 的許多數(shù)學(xué)參考資料,包括 CPAN 數(shù)學(xué)模塊的索引和 CPAN 中算法部分的模塊,以及 Perl 數(shù)據(jù)語(yǔ)言(Perl Data Language),它旨在為 Perl 提供壓縮存儲(chǔ)以及快速操作大型 N 維數(shù)據(jù)數(shù)組的能力。
6.有關(guān) John Chambers 的 S 編程語(yǔ)言的更多信息,請(qǐng)查閱關(guān)于他的出版物以及他在貝爾實(shí)驗(yàn)室的各項(xiàng)研究項(xiàng)目的鏈接。還可以了解在 1998 年因語(yǔ)言設(shè)計(jì)而獲得的 ACM 獎(jiǎng)。
7.R 是用于統(tǒng)計(jì)計(jì)算和圖形的語(yǔ)言和環(huán)境,類(lèi)似于獲獎(jiǎng)的 S System,R 提供了諸如線性和非線性建模、統(tǒng)計(jì)測(cè)試、時(shí)間序列分析、分類(lèi)、群集之類(lèi)的統(tǒng)計(jì)和圖形技術(shù)。請(qǐng)?jiān)?R Project 主頁(yè)上了解 R。
8.如果您剛接觸 PHP,那么請(qǐng)閱讀 Amol Hatwar 的 developerWorks 系列文章:“用 PHP 開(kāi)發(fā)健壯的代碼:”“第 1 部分: 高屋建瓴的介紹 ”(2002 年 8 月)、“第 2 部分: 有效地使用變量”(2002 年 9 月)和“第 3 部分: 編寫(xiě)可重用函數(shù)”(2002 年 11 月)。
9.訪問(wèn) John Pezzullo 的優(yōu)秀站點(diǎn),該站點(diǎn)專(zhuān)門(mén)提供執(zhí)行統(tǒng)計(jì)計(jì)算的網(wǎng)頁(yè)?;?PHP 的概率函數(shù)是以在 John 的概率函數(shù)頁(yè)面所找到的代碼為基礎(chǔ)的。
10.到 Digital Library of Mathematical Functions 了解關(guān)于 M. Abramowitz 和 I.A. Stegun 編寫(xiě)的書(shū)籍 The Handbook of Mathematical Functions(也稱為 AMS55)的更多信息。
11.查看 JpGraph 站點(diǎn),以獲取關(guān)于 PHP 的主要 OO 圖形庫(kù)的大量信息。
12.閱讀美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究所(National Institute of Standards,NIST)出版的 The Engineering Handbook of Statistics,該手冊(cè)上有幾章是關(guān)于 Exploratory Data Analysis 的,非常不錯(cuò)。
13.如果您對(duì)于更詳盡地學(xué)習(xí)關(guān)于回歸的主題感興趣的話,請(qǐng)嘗試閱讀以下有用的參考資料:
L. C. Hamilton(1992年)。Regression with Graphics。加州 Pacific Grove:Brooks/Cole Publishing Company。
J Neter、M.H. Kutner 和 W Wasserman W(1990 年)。Applied Linear Regression Models(第 3 版)。芝加哥 Irwin。
E. J. Pedhazur(1982 年)。Multiple regression in behavioral research。紐約州,紐約市:Holt,Rinehart and Winston。
14.閱讀 Cameron Laird 的文章“Open source in the biosciences”。PHP 需要更好的數(shù)學(xué)工具來(lái)參與這個(gè)不斷成長(zhǎng)的市場(chǎng)(developerWorks,2002 年 11 月)。
15.查看 RWeb,它是基于 Web 的 R 接口。

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

The core method of building social sharing functions in PHP is to dynamically generate sharing links that meet the requirements of each platform. 1. First get the current page or specified URL and article information; 2. Use urlencode to encode the parameters; 3. Splice and generate sharing links according to the protocols of each platform; 4. Display links on the front end for users to click and share; 5. Dynamically generate OG tags on the page to optimize sharing content display; 6. Be sure to escape user input to prevent XSS attacks. This method does not require complex authentication, has low maintenance costs, and is suitable for most content sharing needs.

User voice input is captured and sent to the PHP backend through the MediaRecorder API of the front-end JavaScript; 2. PHP saves the audio as a temporary file and calls STTAPI (such as Google or Baidu voice recognition) to convert it into text; 3. PHP sends the text to an AI service (such as OpenAIGPT) to obtain intelligent reply; 4. PHP then calls TTSAPI (such as Baidu or Google voice synthesis) to convert the reply to a voice file; 5. PHP streams the voice file back to the front-end to play, completing interaction. The entire process is dominated by PHP to ensure seamless connection between all links.

To realize text error correction and syntax optimization with AI, you need to follow the following steps: 1. Select a suitable AI model or API, such as Baidu, Tencent API or open source NLP library; 2. Call the API through PHP's curl or Guzzle and process the return results; 3. Display error correction information in the application and allow users to choose whether to adopt it; 4. Use php-l and PHP_CodeSniffer for syntax detection and code optimization; 5. Continuously collect feedback and update the model or rules to improve the effect. When choosing AIAPI, focus on evaluating accuracy, response speed, price and support for PHP. Code optimization should follow PSR specifications, use cache reasonably, avoid circular queries, review code regularly, and use X

1. Maximizing the commercial value of the comment system requires combining native advertising precise delivery, user paid value-added services (such as uploading pictures, top-up comments), influence incentive mechanism based on comment quality, and compliance anonymous data insight monetization; 2. The audit strategy should adopt a combination of pre-audit dynamic keyword filtering and user reporting mechanisms, supplemented by comment quality rating to achieve content hierarchical exposure; 3. Anti-brushing requires the construction of multi-layer defense: reCAPTCHAv3 sensorless verification, Honeypot honeypot field recognition robot, IP and timestamp frequency limit prevents watering, and content pattern recognition marks suspicious comments, and continuously iterate to deal with attacks.

PHP does not directly perform AI image processing, but integrates through APIs, because it is good at web development rather than computing-intensive tasks. API integration can achieve professional division of labor, reduce costs, and improve efficiency; 2. Integrating key technologies include using Guzzle or cURL to send HTTP requests, JSON data encoding and decoding, API key security authentication, asynchronous queue processing time-consuming tasks, robust error handling and retry mechanism, image storage and display; 3. Common challenges include API cost out of control, uncontrollable generation results, poor user experience, security risks and difficult data management. The response strategies are setting user quotas and caches, providing propt guidance and multi-picture selection, asynchronous notifications and progress prompts, key environment variable storage and content audit, and cloud storage.

PHP ensures inventory deduction atomicity through database transactions and FORUPDATE row locks to prevent high concurrent overselling; 2. Multi-platform inventory consistency depends on centralized management and event-driven synchronization, combining API/Webhook notifications and message queues to ensure reliable data transmission; 3. The alarm mechanism should set low inventory, zero/negative inventory, unsalable sales, replenishment cycles and abnormal fluctuations strategies in different scenarios, and select DingTalk, SMS or Email Responsible Persons according to the urgency, and the alarm information must be complete and clear to achieve business adaptation and rapid response.

PHPisstillrelevantinmodernenterpriseenvironments.1.ModernPHP(7.xand8.x)offersperformancegains,stricttyping,JITcompilation,andmodernsyntax,makingitsuitableforlarge-scaleapplications.2.PHPintegrateseffectivelyinhybridarchitectures,servingasanAPIgateway

Select the appropriate AI voice recognition service and integrate PHPSDK; 2. Use PHP to call ffmpeg to convert recordings into API-required formats (such as wav); 3. Upload files to cloud storage and call API asynchronous recognition; 4. Analyze JSON results and organize text using NLP technology; 5. Generate Word or Markdown documents to complete the automation of meeting records. The entire process needs to ensure data encryption, access control and compliance to ensure privacy and security.
