簡介
與其它開放源碼語言(比如 perl 和 python)相比,php 社區(qū)缺少強(qiáng)有力的工作來開發(fā)數(shù)學(xué)庫。造成這種狀況的一個(gè)原因可能是由于已經(jīng)存在大量成熟的數(shù)學(xué)工具,這可能阻礙了社區(qū)自行開發(fā) php 工具的工作。例如,我曾研究過一個(gè)功能強(qiáng)大的工具 s system,它擁有一組令人印象深刻的統(tǒng)計(jì)庫,專門被設(shè)計(jì)成用來分析數(shù)據(jù)集,并且在 1998 年由于其語言設(shè)計(jì)而獲得了 acm 獎(jiǎng)。如果 s 或者其開放源碼同類 r 僅僅是一個(gè) exec_shell 調(diào)用,那么為何還要麻煩用 php 實(shí)現(xiàn)相同的統(tǒng)計(jì)計(jì)算功能呢?有關(guān) s system、它的 acm 獎(jiǎng)或 r 的更多信息,請(qǐng)參閱參考資料。
難道這不是在浪費(fèi)開發(fā)人員的精力嗎?如果開發(fā) php 數(shù)學(xué)庫的動(dòng)機(jī)是出自節(jié)省開發(fā)人員的精力以及使用最好的工具來完成工作,那么 php 現(xiàn)在的課題是很有意義的。
另一方面,出于教學(xué)動(dòng)機(jī)可能會(huì)鼓勵(lì)對(duì) php 數(shù)學(xué)庫的開發(fā)。對(duì)于大約 10% 的人來說,數(shù)學(xué)是個(gè)值得探索的有趣課題。對(duì)于那些同時(shí)還熟練應(yīng)用 php 的人來說,php 數(shù)學(xué)庫的開發(fā)可以增強(qiáng)數(shù)學(xué)學(xué)習(xí)過程,換句話說,不要只閱讀有關(guān) t 測試的章節(jié),還要實(shí)現(xiàn)一個(gè)能計(jì)算相應(yīng)的中間值并用標(biāo)準(zhǔn)格式顯示它們的類。
通過指導(dǎo)和訓(xùn)練,我希望證明開發(fā) php 數(shù)學(xué)庫并不是一項(xiàng)很難的任務(wù),它可能代表一項(xiàng)有趣的技術(shù)和學(xué)習(xí)難題。在本文中,我將提供一個(gè) php 數(shù)學(xué)庫示例,名為 simplelinearregression,它演示了一個(gè)可以用來開發(fā) php 數(shù)學(xué)庫的通用方法。讓我們從討論一些通用的原則開始,這些原則指導(dǎo)我開發(fā)這個(gè) simplelinearregression 類。
指導(dǎo)原則
我使用了六個(gè)通用原則來指導(dǎo) simplelinearregression 類的開發(fā)。
每個(gè)分析模型建立一個(gè)類。
使用逆向鏈接來開發(fā)類。
預(yù)計(jì)有大量的 getter。
存儲(chǔ)中間結(jié)果。
為詳細(xì)的 api 制定首選項(xiàng)。
盡善盡美并非目標(biāo)。
讓我們更詳細(xì)地逐條研究這些指導(dǎo)方針。
每個(gè)分析模型建立一個(gè)類
每種主要的分析測試或過程應(yīng)當(dāng)有一個(gè)名稱與測試或過程名相同的 php 類,這個(gè)類包含了輸入函數(shù)、計(jì)算中間值和匯總值的函數(shù)和輸出函數(shù)(將中間值和匯總值用文本或圖形格式全部顯示在屏幕上)。
使用逆向鏈接來開發(fā)類
在數(shù)學(xué)編程中,編碼的目標(biāo)通常是分析過程(比如 multipleregression、timeseries 或 chisquared)所希望生成的標(biāo)準(zhǔn)輸出值。從解決問題的角度出發(fā),這意味著您可以使用逆向鏈接來開發(fā)數(shù)學(xué)類的方法。
例如,匯總輸出屏幕顯示了一個(gè)或多個(gè)匯總統(tǒng)計(jì)結(jié)果。這些匯總統(tǒng)計(jì)結(jié)果依賴于中間統(tǒng)計(jì)結(jié)果的計(jì)算,這些中間統(tǒng)計(jì)結(jié)果又可能會(huì)涉及到更深一層的中間統(tǒng)計(jì)結(jié)果,以此類推。這個(gè)基于逆向鏈接的開發(fā)方法導(dǎo)出了下一個(gè)原則。
預(yù)計(jì)有大量的 getter
數(shù)學(xué)類的大部分類開發(fā)工作都涉及到計(jì)算中間值和匯總值。實(shí)際上,這意味著,如果您的類包含許多計(jì)算中間值和匯總值的 getter 方法,您不應(yīng)當(dāng)感到驚訝。
存儲(chǔ)中間結(jié)果
將中間計(jì)算結(jié)果存儲(chǔ)在結(jié)果對(duì)象內(nèi),這樣您就可以將中間結(jié)果用作后續(xù)計(jì)算的輸入。在 s 語言設(shè)計(jì)中實(shí)施了這一原則。在當(dāng)前環(huán)境下,通過選擇實(shí)例變量來表示計(jì)算得到的中間值和匯總結(jié)果,從而實(shí)施了該原則。
為詳細(xì)的 api 制定首選項(xiàng)
當(dāng)為 simplelinearregression 類中的成員函數(shù)和實(shí)例變量制定命名方案時(shí),我發(fā)現(xiàn):如果我使用較長的名稱(類似于 getsumsquarederror 這樣的名稱,而不是 getyy2)來描述成員函數(shù)和實(shí)例變量,那么就更容易了解函數(shù)的操作內(nèi)容和變量所代表的意義。
我沒有完全放棄簡寫名稱;但是,當(dāng)我用簡寫形式的名稱時(shí),我得設(shè)法提供注釋以完整闡述該名稱的含義。我的看法是:高度簡寫的命名方案在數(shù)學(xué)編程中很常見,但它們使得理解和證明某個(gè)數(shù)學(xué)例程是否按部就班更為困難,而原本不必造成此種困難。
盡善盡美并非目標(biāo)
這個(gè)編碼練習(xí)的目標(biāo)不是一定要為 php 開發(fā)高度優(yōu)化和嚴(yán)格的數(shù)學(xué)引擎。在早期階段,應(yīng)當(dāng)強(qiáng)調(diào)學(xué)習(xí)實(shí)現(xiàn)意義重大的分析測試,以及解決這方面的難題。
實(shí)例變量:當(dāng)對(duì)統(tǒng)計(jì)測試或過程進(jìn)行建模時(shí),您需要指出聲明哪些實(shí)例變量。
實(shí)例變量的選擇可以通過說明由分析過程生成的中間值和匯總值來確定。每個(gè)中間值和匯總值都可以有一個(gè)相應(yīng)的實(shí)例變量,將變量的值作為對(duì)象屬性。
我采用這樣的分析來確定為清單 1 中的 simplelinearregression 類聲明哪些變量。可以對(duì)multipleregression、anova 或 timeseries 過程執(zhí)行類似的分析。
|
構(gòu)造函數(shù)
simplelinearregression 類的構(gòu)造函數(shù)方法接受一個(gè) x 和一個(gè) y 向量,每個(gè)向量都有相同數(shù)量的值。您還可以為您預(yù)計(jì)的 y 值設(shè)置一個(gè)缺省為 95% 的置信區(qū)間(confidence interval)。
構(gòu)造函數(shù)方法從驗(yàn)證數(shù)據(jù)形式是否適合于處理開始。一旦輸入向量通過了“大小相等”和“值大于 1”測試,就執(zhí)行算法的核心部分。
執(zhí)行這項(xiàng)任務(wù)涉及到通過一系列 getter 方法計(jì)算統(tǒng)計(jì)過程的中間值和匯總值。將每個(gè)方法調(diào)用的返回值賦給該類的一個(gè)實(shí)例變量。用這種方法存儲(chǔ)計(jì)算結(jié)果確保了前后鏈接的計(jì)算中的調(diào)用例程可以使用中間值和匯總值。還可以通過調(diào)用該類的輸出方法來顯示這些結(jié)果,如清單 2 所描述的那樣。
|
新聞熱點(diǎn)
疑難解答
圖片精選