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

Hot Topics

Comments cannot be careless because they want to explain the reasons for the existence of the code rather than the functions, such as compatibility with old interfaces or third-party restrictions, otherwise people who read the code can only rely on guessing. The areas that must be commented include complex conditional judgments, special error handling logic, and temporary bypass restrictions. A more practical way to write comments is to select single-line comments or block comments based on the scene. Use document block comments to explain parameters and return values at the beginning of functions, classes, and files, and keep comments updated. For complex logic, you can add a line to the previous one to summarize the overall intention. At the same time, do not use comments to seal code, but use version control tools.

TolearnPHPeffectively,startbysettingupalocalserverenvironmentusingtoolslikeXAMPPandacodeeditorlikeVSCode.1)InstallXAMPPforApache,MySQL,andPHP.2)Useacodeeditorforsyntaxsupport.3)TestyoursetupwithasimplePHPfile.Next,learnPHPbasicsincludingvariables,ech

The key to setting up PHP is to clarify the installation method, configure php.ini, connect to the web server and enable necessary extensions. 1. Install PHP: Use apt for Linux, Homebrew for Mac, and XAMPP recommended for Windows; 2. Configure php.ini: Adjust error reports, upload restrictions, etc. and restart the server; 3. Use web server: Apache uses mod_php, Nginx uses PHP-FPM; 4. Install commonly used extensions: such as mysqli, json, mbstring, etc. to support full functions.

The key to writing PHP comments is clear, useful and concise. 1. Comments should explain the intention behind the code rather than just describing the code itself, such as explaining the logical purpose of complex conditional judgments; 2. Add comments to key scenarios such as magic values, old code compatibility, API interfaces, etc. to improve readability; 3. Avoid duplicate code content, keep it concise and specific, and use standard formats such as PHPDoc; 4. Comments should be updated synchronously with the code to ensure accuracy. Good comments should be thought from the perspective of others, reduce the cost of understanding, and become a code understanding navigation device.

PHPblockcommentsareusefulforwritingmulti-lineexplanations,temporarilydisablingcode,andgeneratingdocumentation.Theyshouldnotbenestedorleftunclosed.BlockcommentshelpindocumentingfunctionswithPHPDoc,whichtoolslikePhpStormuseforauto-completionanderrorche

The key to writing good comments is to explain "why" rather than just "what was done" to improve the readability of the code. 1. Comments should explain logical reasons, such as considerations behind value selection or processing; 2. Use paragraph annotations for complex logic to summarize the overall idea of functions or algorithms; 3. Regularly maintain comments to ensure consistency with the code, avoid misleading, and delete outdated content if necessary; 4. Synchronously check comments when reviewing the code, and record public logic through documents to reduce the burden of code comments.

PHP's switch statement is suitable for processing multiple fixed value judgments. 1. Switch judges variable values through loose comparison, with a clear structure, suitable for user roles, request types, state machines and other scenarios; 2. Break should be added after each case to avoid penetration, but penetration can also be used to implement multiple cases sharing logic; 3. Default is optional, but it is recommended to add it to deal with unmatched situations; 4. Pay attention to type matching issues, and type consistency needs to be manually handled if necessary.

The key to writing PHP comments is to clarify the purpose and specifications. Comments should explain "why" rather than "what was done", avoiding redundancy or too simplicity. 1. Use a unified format, such as docblock (/*/) for class and method descriptions to improve readability and tool compatibility; 2. Emphasize the reasons behind the logic, such as why JS jumps need to be output manually; 3. Add an overview description before complex code, describe the process in steps, and help understand the overall idea; 4. Use TODO and FIXME rationally to mark to-do items and problems to facilitate subsequent tracking and collaboration. Good annotations can reduce communication costs and improve code maintenance efficiency.
