PHP實現簡單線性回歸之數學庫的重要性

2021-01-08 站長之家
簡介

與其它開放源碼語言(比如Perl和Python)相比,PHP社區缺少強有力的工作來開發數學庫。

造成這種狀況的一個原因可能是由於已經存在大量成熟的數學工具,這可能阻礙了社區自行開發PHP工具的工作。例如,我曾研究過一個功能強大的工具SSystem,它擁有一組令人印象深刻的統計庫,專門被設計成用來分析數據集,並且在1998年由於其語言設計而獲得了ACM獎。如果S或者其開放源碼同類R僅僅是一個

exec_shell

調用,那麼為何還要麻煩用PHP實現相同的統計計算功能呢?有關SSystem、它的ACM獎或R的更多信息,請參閱相關參考資料。

難道這不是在浪費開發人員的精力嗎?如果開發PHP數學庫的動機是出自節省開發人員的精力以及使用最好的工具來完成工作,那麼PHP現在的課題是很有意義的。

另一方面,出於教學動機可能會鼓勵對PHP數學庫的開發。對於大約10%的人來說,數學是個值得探索的有趣課題。對於那些同時還熟練應用PHP的人來說,PHP數學庫的開發可以增強數學學習過程,換句話說,不要只

閱讀

有關T測試的章節,還要

實現

一個能計算相應的中間值並用標準格式顯示它們的類。

通過指導和訓練,我希望證明開發PHP數學庫並不是一項很難的任務,它可能代表一項有趣的技術和學習難題。在本文中,我將提供一個PHP數學庫示例,名為

SimpleLinearRegression

,它演示了一個可以用來開發PHP數學庫的通用方法。讓我們從討論一些通用的原則開始,這些原則指導我開發這個

SimpleLinearRegression

類。

指導原則

我使用了六個通用原則來指導

SimpleLinearRegression

類的開發。

每個分析模型建立一個類。使用逆向連結來開發類。預計有大量的getter。存儲中間結果。為詳細的API制定首選項。盡善盡美並非目標。

讓我們更詳細地逐條研究這些指導方針。 

每個分析模型建立一個類

每種主要的分析測試或過程應當有一個名稱與測試或過程名相同的PHP類,這個類包含了輸入函數、計算中間值和匯總值的函數和輸出函數(將中間值和匯總值用文本或圖形格式全部顯示在屏幕上)。

使用逆向連結來開發類

在數學編程中,編碼的目標通常是分析過程(比如

MultipleRegression

TimeSeries

ChiSquared

)所希望生成的標準輸出值。從解決問題的角度出發,這意味著您可以使用逆向連結來開發數學類的方法。

例如,匯總輸出屏幕顯示了一個或多個匯總統計結果。這些匯總統計結果依賴於中間統計結果的計算,這些中間統計結果又可能會涉及到更深一層的中間統計結果,以此類推。這個基於逆向連結的開發方法導出了下一個原則。

預計有大量的getter

數學類的大部分類開發工作都涉及到計算中間值和匯總值。實際上,這意味著,如果您的類包含許多計算中間值和匯總值的getter方法,您不應當感到驚訝。

存儲中間結果

將中間計算結果存儲在結果對象內,這樣您就可以將中間結果用作後續計算的輸入。在S語言設計中實施了這一原則。在當前環境下,通過選擇實例變量來表示計算得到的中間值和匯總結果,從而實施了該原則。

為詳細的API制定首選項

當為

SimpleLinearRegression

類中的成員函數和實例變量制定命名方案時,我發現:如果我使用較長的名稱(類似於

getSumSquaredError

這樣的名稱,而不是

getYY2

)來描述成員函數和實例變量,那麼就更容易了解函數的操作內容和變量所代表的意義。

我沒有完全放棄簡寫名稱;但是,當我用簡寫形式的名稱時,我得設法提供注釋以完整闡述該名稱的含義。我的看法是:高度簡寫的命名方案在數學編程中很常見,但它們使得理解和證明某個數學例程是否按部就班更為困難,而原本不必造成此種困難。

盡善盡美並非目標

這個編碼練習的目標不是一定要為

PHP開發

高度優化和嚴格的數學引擎。在早期階段,應當強調學習實現意義重大的分析測試,以及解決這方面的難題。

實例變量

當對統計測試或過程進行建模時,您需要指出聲明哪些實例變量。

實例變量的選擇可以通過說明由分析過程生成的中間值和匯總值來確定。每個中間值和匯總值都可以有一個相應的實例變量,將變量的值作為對象屬性。

我採用這樣的分析來確定為清單1中的

SimpleLinearRegression

類聲明哪些變量。可以對

MultipleRegression

ANOVA

TimeSeries

過程執行類似的分析。

清單1.SimpleLinearRegression類的實例變量

<?php//Copyright2003,PaulMeagher//DistributedunderGPLclassSimpleLinearRegression{var$n;var$X=array();var$Y=array();var$ConfInt;var$Alpha;var$XMean;var$YMean;var$SumXX;var$SumXY;var$SumYY;var$Slope;var$YInt;var$PredictedY=array();var$Error=array();var$SquaredError=array();var$TotalError;var$SumError;var$SumSquaredError;var$ErrorVariance;var$StdErr;var$SlopeStdErr;var$SlopeVal;//TvalueofSlopevar$YIntStdErr;var$YIntTVal;//TvalueforYInterceptvar$R;var$RSquared;var$DF;//DegreesofFreedomvar$SlopeProb;//ProbabilityofSlopeEstimatevar$YIntProb;//ProbabilityofYInterceptEstimatevar$AlphaTVal;//TValueforgivenalphasettingvar$ConfIntOfSlope;var$RPath="/usr/local/bin/R";//Yourpathherevar$format="%01.2f";//Usedforformattingoutput}?>

#p#分頁標題#e#構造函數

SimpleLinearRegression類的構造函數方法接受一個X和一個Y向量,每個向量都有相同數量的值。您還可以為您預計的Y值設置一個預設為95%的置信區間(confidenceinterval)。

構造函數方法從驗證數據形式是否適合於處理開始。一旦輸入向量通過了「大小相等」和「值大於1」測試,就執行算法的核心部分。

執行這項任務涉及到通過一系列getter方法計算統計過程的中間值和匯總值。將每個方法調用的返回值賦給該類的一個實例變量。用這種方法存儲計算結果確保了前後連結的計算中的調用例程可以使用中間值和匯總值。還可以通過調用該類的輸出方法來顯示這些結果,如清單2所描述的那樣。

清單2.調用類輸出方法

<?php//Copyright2003,PaulMeagher//DistributedunderGPLfunctionSimpleLinearRegression($X,$Y,$ConfidenceInterval="95"){$numX=count($X);$numY=count($Y);if($numX!=$numY){die("Error:SizeofXandYvectorsmustbethesame.");}if($numX<=1){die("Error:Sizeofinputarraymustbeatleast2.");}$this->n=$numX;$this->X=$X;$this->Y=$Y;$this->ConfInt=$ConfidenceInterval;$this->Alpha=(1+($this->ConfInt/100))/2;$this->XMean=$this->getMean($this->X);$this->YMean=$this->getMean($this->Y);$this->SumXX=$this->getSumXX();$this->SumYY=$this->getSumYY();$this->SumXY=$this->getSumXY();$this->Slope=$this->getSlope();$this->YInt=$this->getYInt();$this->PredictedY=$this->getPredictedY();$this->Error=$this->getError();$this->SquaredError=$this->getSquaredError();$this->SumError=$this->getSumError();$this->TotalError=$this->getTotalError();$this->SumSquaredError=$this->getSumSquaredError();$this->ErrorVariance=$this->getErrorVariance();$this->StdErr=$this->getStdErr();$this->SlopeStdErr=$this->getSlopeStdErr();$this->YIntStdErr=$this->getYIntStdErr();$this->SlopeTVal=$this->getSlopeTVal();$this->YIntTVal=$this->getYIntTVal();$this->R=$this->getR();$this->RSquared=$this->getRSquared();$this->DF=$this->getDF();$this->SlopeProb=$this->getStudentProb($this->SlopeTVal,$this->DF);$this->YIntProb=$this->getStudentProb($this->YIntTVal,$this->DF);$this->AlphaTVal=$this->getInverseStudentProb($this->Alpha,$this->DF);$this->ConfIntOfSlope=$this->getConfIntOfSlope();returntrue;}?>


方法名及其序列是通過結合逆向連結和參考大學本科學生使用的統計學教科書推導得出的,該教科書一步一步地說明了如何計算中間值。我需要計算的中間值的名稱帶有「get」前綴,從而推導出方法名。

使模型與數據相吻合

SimpleLinearRegression過程用於產生與數據相吻合的直線,其中直線具有以下標準方程:

y=b+mx

該方程的PHP格式看起來類似於清單3:

清單3.使模型與數據相吻合的PHP方程

$PredictedY[$i]=$YIntercept+$Slope*$X[$i]


SimpleLinearRegression類使用最小二乘法準則推導出Y軸截距(YIntercept)和斜率(Slope)參數的估計值。這些估計的參數用來構造線性方程(請參閱清單3),該方程對X和Y值之間的關係進行建模。

使用推導出的線性方程,您就可以得到每個X值對應的預測Y值。如果線性方程與數據非常吻合,那麼Y的觀測值與預測值趨近於一致。

如何確定是否非常吻合

SimpleLinearRegression類生成了相當多的匯總值。一個重要的匯總值是T統計值,它可以用來衡量一個線性方程與數據的吻合程度。如果非常吻合,那麼T統計值往往很大。如果T統計值很小,那麼應當用一個模型替換該線性方程,該模型假設Y值的均值是最佳預測值(也就是說,一組值的均值通常是下一個觀測值有用的預測值,使之成為預設模型)。

要測試T統計值是否大得足以不把Y值的均值作為最佳預測值,您需要計算獲取T統計值的隨機概率。如果獲取T統計值的概率很低,那麼您可以否定均值是最佳預測值這個無效假設,與此相對應,也就確信簡單線性模型與數據非常吻合。

那麼,如何計算T統計值的概率呢?

#p#分頁標題#e#計算T統計值概率

由於PHP缺少計算T統計值概率的數學例程,因此我決定將此任務交給統計計算包R(請參閱參考資料中的www.r-project.org)來獲得必要的值。我還想提醒大家注意該包,因為:
R提供了許多想法,PHP開發人員可能會在PHP數學庫中模擬這些想法。有了R,可以確定從PHP數學庫獲得的值與那些從成熟的免費可用的開放源碼統計包中獲得的值是否一致。清單4中的代碼演示了交給R來處理以獲取一個值是多麼容易。

清單4.交給R統計計算包來處理以獲取一個值

<?php//Copyright2003,PaulMeagher//DistributedunderGPLclassSimpleLinearRegression{var$RPath="/usr/local/bin/R";//YourpathherefunctiongetStudentProb($T,$df){$Probability=0.0;$cmd="echo'dt($T,$df)'|$this->RPath--slave";$result=shell_exec($cmd);list($LineNumber,$Probability)=explode("",trim($result));return$Probability;}functiongetInverseStudentProb($alpha,$df){$InverseProbability=0.0;$cmd="echo'qt($alpha,$df)'|$this->RPath--slave";$result=shell_exec($cmd);list($LineNumber,$InverseProbability)=explode("",trim($result));return$InverseProbability;}}?>


請注意,這裡已經設置了到R可執行文件的路徑,並在兩個函數中使用了該路徑。第一個函數根據學生的T分布返回了與T統計值相關的概率值,而第二個反函數計算了與給定的alpha設置相對應的T統計值。getStudentProb方法用來評估線性模型的吻合程度;getInverseStudentProb方法返回一個中間值,它用來計算每個預測的Y值的置信區間。

由於篇幅有限,我不可能逐個詳細說明這個類中的所有函數,因此如果您想搞清楚簡單線性回歸分析中所涉及的術語和步驟,我鼓勵您參考大學本科學生使用的統計學教科書。

燃耗研究

要演示如何使用該類,我可以使用來自公共事業中燃耗(burnout)研究中的數據。MichaelLeiter和KimberlyAnnMeechan研究了稱為消耗指數(ExhaustionIndex)的燃耗度量單位和稱之為集中度(Concentration)的獨立變量之間的關係。集中度是指人們的社交接觸中來自其工作環境的那部分比例。

要研究他們樣本中個人的消耗指數值與集中度值之間的關係,請將這些值裝入適當命名的數組中,並用這些數組值對該類進行實例化。對類進行實例化後,顯示該類所生成的某些匯總值以評估線性模型與數據的吻合程度。

清單5顯示了裝入數據和顯示匯總值的腳本:

清單5.用於裝入數據並顯示匯總值的腳本

<?php//BurnoutStudy.php//Copyright2003,PaulMeagher//DistributedunderGPLinclude"SimpleLinearRegression.php";//Loaddatafromburnoutstudy$Concentration=array(20,60,38,88,79,87,68,12,35,70,80,92,77,86,83,79,75,81,75,77,77,77,17,85,96);$ExhaustionIndex=array(100,525,300,980,310,900,410,296,120,501,920,810,506,493,892,527,600,855,709,791,718,684,141,400,970);$slr=newSimpleLinearRegression($Concentration,$ExhaustionIndex);$YInt=sprintf($slr->format,$slr->YInt);$Slope=sprintf($slr->format,$slr->Slope);$SlopeTVal=sprintf($slr->format,$slr->SlopeTVal);$SlopeProb=sprintf("%01.6f",$slr->SlopeProb);?><tableborder='1'cellpadding='5'><tr><thalign='right'>Equation:</th><td></td></tr><tr><thalign='right'>T:</th><td></td></tr><tr><thalign='right'>Prob>T:</th><td><td></tr></table>


通過Web瀏覽器運行該腳本,產生以下輸出:

Equation:Exhaustion=-29.50+(8.87*Concentration)T:6.03Prob>T:0.000005
這張表的最後一行指出獲取這樣大T值的隨機概率非常低。可以得出這樣的結論:與僅僅使用消耗值的均值相比,簡單線性模型的預測能力更好。

知道了某個人的工作場所聯繫的集中度,就可以用來預測他們可能正在消耗的燃耗程度。這個方程告訴我們:集中度值每增加1個單位,社會服務領域中一個人的消耗值就會增加8個單位。這進一步證明了:要減少潛在的燃耗,社會服務領域中的個人應當考慮在其工作場所之外結交朋友。

這只是粗略地描述了這些結果可能表示的含義。為全面研究這個數據集的含義,您可能想更詳細地研究這個數據以確信這是正確的解釋。在下一篇文章中我將討論應當執行其它哪些分析。

您學到了什麼?

其一,要開發意義重大的基於PHP的數學包,您不必是一名火箭科學家。堅持標準的面向對象技術,以及明確地採用逆向連結問題解決方法,就可以相對方便地使用PHP實現某些較為基本的統計過程。

從教學的觀點出發,我認為:如果只是因為要求您在較高和較低的抽象層次思考統計測試或例程,那麼這個練習是非常有用的。換句話說,補充您的統計測試或過程學習的一個好辦法就是將這個過程作為算法實現。

要實現統計測試通常需要超出所給定的信息範圍並創造性地解決和發現問題。對於發現對某個學科認識的不足而言,它也是一個好辦法。

不利的一面,您發現PHP對於取樣分布缺乏內在手段,而這是實現大多數統計測試所必需的。您需要交給R來處理以獲取這些值,但是我擔心您會沒時間或沒興趣安裝R。某些常見概率函數的本機PHP實現可以解決這個問題。

另一個問題是:該類生成許多中間值和匯總值,但是匯總輸出實際上沒有利用這一點。我提供了一些難處理的輸出,但是這既不夠充分也沒進行很好的組織,以致您無法充分地解釋分析結果。實際上,我完全不知道如何可以將輸出方法集成到該類中。這需要得到解決。

最後,要弄明白數據,不僅僅是察看匯總值就可以了。您還需要明白各個數據點是如何分布的。最好的辦法之一是將您的數據繪製成圖表。再次聲明,我對這方面不太了解,但是如果要用這個類來分析實際數據的話就需要解決這個問題。

相關焦點

  • Python環境下的8種簡單線性回歸算法
    選自Medium作者:Tirthajyoti Sarkar機器之心編譯參與:晏奇、劉曉坤本文中,作者討論了 8 種在 Python 環境下進行簡單線性回歸計算的算法,不過沒有討論其性能的好壞,而是對比了其相對計算複雜度的度量。
  • 8 種進行簡單線性回歸的方法分析與討論
    對於大多數數據科學家而言,線性回歸方法是他們進行統計學建模和預測分析任務的起點。但我們不可誇大線性模型(快速且準確地)擬合大型數據集的重要性。如本文所示,在線性回歸模型中,「線性」一詞指的是回歸係數,而不是特徵的 degree。
  • 7種執行簡單的線性回歸的分析與討論!
    【IT168 資訊】對於無數的數據科學家來說,線性回歸是許多統計建模和預測分析項目的起點。擬合的重要性,無論是準確的還是快速的,對於大數據集的線性模型都不能被誇大。由於scikit-learn是一種免費的機器學習庫,它具有回歸、分類、聚類、模型選擇和降維等功能,所以常用的方法是從該庫調用線性模型類並擬合數據。雖然這可以為應用機器學習的其他流水線特性(例如數據規範化,模型係數正則化,將線性模型提供給另一個下遊模型)提供額外的優勢,但這通常不是確定回歸係數(和一些基本的相關統計)最快或最乾淨、簡單的方法。
  • 一文教你全面掌握用Python實現線性回歸
    本文首先會深入挖掘線性回歸理論,理解其內在的工作機制,然後利用Python實現該算法,為商業問題建模。理論線性回歸或許是學習統計學最簡單的方法。在學習更高級的方法之前,這是一個很好的入門方法。接下來本文將介紹如何在Python中實現一元線性回歸和多元線性回歸,以及如何評估兩種模型的模型參數質量和模型整體表現。強烈建議讀者在閱讀本文之後動手在Jupyter notebook上復現整個過程,這將有助於讀者充分理解和利用該教程。那麼開始吧!
  • 8種用Python實現線性回歸的方法
    另一方面,也是更為重要的一點,線性模型的易解釋性使得它在物理學、經濟學、商學等領域中佔據了難以取代的地位。那麼,如何用Python來實現線性回歸呢?由於機器學習庫scikit-learn的廣泛流行,常用的方法是從該庫中調用linear_model來擬合數據。
  • 8種用Python實現線性回歸的方法,究竟哪個方法最高效?
    今天,讓我們來談談線性回歸。沒錯,作為數據科學界元老級的模型,線性回歸幾乎是所有數據科學家的入門必修課。拋開涉及大量數統的模型分析和檢驗不說,你真的就能熟練應用線性回歸了麼?未必!在這篇文章中,文摘菌將介紹8種用Python實現線性回歸的方法。了解了這8種方法,就能夠根據不同需求,靈活選取最為高效的方法實現線性回歸。
  • 簡單線性回歸分析
    廣義上來講,它是通過建立數學模型的方法,探索自變量與因變量的關係,嘗試以自變量的差異來解釋因變量的不同。上一節我們對67例居民身高和體重的相關性分析發現,居民的體重與身高變化密切相關,即隨著身高的增加,體重逐漸上升。我們還是採用之前的數據,介紹SPSS進行線性回歸分析的具體步驟。
  • 機器學習之多元線性回歸模型梯度下降公式與代碼實現(篇二)
    上一篇我們介紹了線性回歸的概述和最小二乘的介紹,對簡單的一元線性方程模型手推了公式和python代碼的實現。機器學習之線性回歸模型詳細手推公式與代碼實現(篇一)今天這一篇來介紹多元線性回歸模型多元線性回歸模型介紹在回歸分析中,如果有兩個或兩個以上的自變量,就稱為多元回歸
  • 線性回歸:簡單線性回歸詳解
    【導讀】本文是一篇專門介紹線性回歸的技術文章,討論了機器學習中線性回歸的技術細節。線性回歸核心思想是獲得最能夠擬合數據的直線。
  • 入門機器學習之線性回歸
    回歸分析是研究相關關係的是一種數學工具,是用一個變量取得的值去估計另一個變量所取得的值。回歸分析按照涉及的變量的多少,分為一元回歸和多元回歸分析;按照因變量的多少,可分為簡單回歸分析和多重回歸分析;按照自變量和因變量之間的關係類型,可分為線性回歸分析和非線性回歸分析。
  • 簡單線性回歸模型
    2 基礎回顧回歸的概念來源於實際問題,那麼現在我們所說的線性回歸分析問題具體指的是什麼呢?3 求解線性回歸模型函數3.1 極大似然法最小二乘法和極大似然法都可以用來求解線性回歸模型,我們在往期文章中討論過最小二乘法,這裡對似然法進行簡單介紹。
  • 兩個例子告訴你:什麼是「線性」回歸模型?
    全文共1534字,預計學習時長3分鐘在機器學習和統計領域,線性回歸模型是最簡單的模型之一。這意味著,人們經常認為對線性回歸的線性假設不夠準確。本文試圖解釋對線性回歸模型的線性假設,以及此類線性假設的重要性。回答上述問題,需要了解以下兩個簡單例子中線性回歸逐步運行的方式。例1:最簡單的模型從最簡單的例子開始。給定3對(x,y)訓練數據:(2,4)、(5,1)、(8,9)進行函數建模,發現目標變量y和輸入變量x之間的關係。
  • 簡單線性回歸(一)
    回歸分析(regression analysis )是研究一個變量如何隨另一些變量變化的方法。例如,學習成績會受努力的時間,方法,個人的智慧,教育資源等因素影響;疾病的發生與生活環境,方式,遺傳因素,自身體質等影響。常見的回歸分析有 線性回歸、非線性回歸、多重線性回歸、Logistic回歸等等。
  • 簡單線性回歸(二)
    線性回歸相關知識:簡單線性回歸(一)線性回歸步驟線性回歸需滿足的條件①因變量Y與自變量X呈線性關係②每個個體觀察值之間互相獨立③在一定範圍內,任意給定X值,其對應的隨機變量Y均服從正態分布④在一定範圍內,不同X值所對應的隨機變量Y的方差相等某研究者測量了16名成年男子的體重(Kg)和臀圍(cm)數據,欲探求成年男子的體重與臀圍是否可以建立線性回歸模型。
  • 【線性回歸】多變量分析:多元回歸分析
    實際上大部分學習統計分析和市場研究的人的都會用回歸分析,操作也是比較簡單的,但能夠知道多元回歸分析的適用條件或是如何將回歸應用於實踐,可能還要真正領會回歸分析的基本思想和一些實際應用手法!下面我們就來談談多元回歸分析,這張圖是利用多元線性回歸製作的策略分析圖,你可以理解X軸是重要性,Y軸是表現;首先,多元回歸分析應該強調是多元線性回歸分析!
  • 衝刺2018年高考數學, 典型例題分析25:線性回歸方程
    某公司要推出一種新產品,分6個相等時長的時段進行試銷,並對賣出的產品進行跟蹤以及收集顧客的評價情況(包括產品評價和服務評價),在試銷階段共賣出了480件,通過對所賣出產品的評價情況和銷量情況進行統計,一方面發現對該產品的好評率為5/6,對服務的好評率為0.75,對產品和服務兩項都沒有好評有30件,另一方面發現銷量和單價有一定的線性相關關係
  • PLS回歸是個啥?與線性回歸有什麼不同?
    在進行回歸分析時,通常都是考察多個X對Y的影響,但有時複雜的研究也會涉及研究多個X對多個Y的影響,尤其是數據存在當自變量存在多重共線性問題時,普通的多元線性回歸無法很好的解決問題。偏最小二乘法回歸則能很好的解決這些問題。
  • 多元線性回歸的模型解釋、假設檢驗、特徵選擇
    線性回歸是最流行和討論最多的模型之一,它無疑是深入機器學習(ML)的入門之路。這種簡單、直接的建模方法值得學習,這是進入ML的第一步。在繼續討論之前,讓我們回顧一下線性回歸可以大致分為兩類。簡單線性回歸:當只有一個輸入變量時,它是線性回歸最簡單的形式。
  • python多重線性回歸分析
    一個簡單的線性回歸模型測試。定義:線性回歸是利用數理統計中回歸分析,來確定兩種或兩種以上變量間相互依賴的定量關係的一種統計分析方法,運用十分廣泛。表達形式為y =aX+b,b為誤差服從均值為0的正態分布,a為截距。
  • 了解線性回歸的數學原理:線性回歸背後的微積分
    線性回歸通常是任何機器學習課程的起點。目的是預測輸入變量與目標變量之間的線性關係。天真的情況是穿過空間原點的直線。在這裡,我們僅限於二維空間,即笛卡爾平面。讓我們從y = mx格式開始逐步發展,然後從y = mx + c回歸開始。y = mx的簡化方案在這種情況下,我們知道我們要對通過原點的數據擬合一條線。