關(guān)于numpy.polyfit()與Stats.linregress()方法最小二乘近似擬合斜率對(duì)比
numpy.polyfit()與Stats.linregress()方法最小二乘近似擬合斜率對(duì)比
對(duì)于大多數(shù)數(shù)據(jù)科學(xué)家而言,線性回歸方法是他們進(jìn)行統(tǒng)計(jì)學(xué)建模和預(yù)測(cè)分析任務(wù)的起點(diǎn)。
而快速且準(zhǔn)確地線性回歸模型對(duì)擬合大型數(shù)據(jù)集非常重要性。
由于在機(jī)器學(xué)習(xí)中,Scikit-learn 是一個(gè)十分流行的 Python 庫(kù),因此,人們經(jīng)常會(huì)從這個(gè)庫(kù)調(diào)用線性模型來(lái)擬合數(shù)據(jù)。
除此之外,我們還可以使用該庫(kù)的 pipeline 與 FeatureUnion 功能(如:數(shù)據(jù)歸一化、模型回歸系數(shù)正則化、將線性模型傳遞給下游模型),但是一般來(lái)看,如果一個(gè)數(shù)據(jù)分析師僅需要一個(gè)又快又簡(jiǎn)單的方法來(lái)確定回歸系數(shù)(或是一些相關(guān)的統(tǒng)計(jì)學(xué)基本結(jié)果),那么這并不是最快或最簡(jiǎn)潔的方法。
接下來(lái),我們研究?jī)蓚€(gè)更快更簡(jiǎn)潔的方法。
1. numpy.polyfit()方法
這是一個(gè)非常一般的最小二乘多項(xiàng)式擬合函數(shù),它適用于任何 degree 的數(shù)據(jù)集與多項(xiàng)式函數(shù)(具體由用戶來(lái)指定),其返回值是一個(gè)(最小化方差)回歸系數(shù)的數(shù)組。
對(duì)于簡(jiǎn)單的線性回歸而言,你可以把 degree 設(shè)為 1。如果你想擬合一個(gè) degree 更高的模型,你也可以通過(guò)從線性特征數(shù)據(jù)中建立多項(xiàng)式特征來(lái)完成。
2. Stats.linregress( ) 方法
這是 Scipy 中的統(tǒng)計(jì)模塊中的一個(gè)高度專門化的線性回歸函數(shù)。
其靈活性相當(dāng)受限,因?yàn)樗粚?duì)計(jì)算兩組測(cè)量值的最小二乘回歸進(jìn)行優(yōu)化。
因此,你不能用它擬合一般的線性模型,或者是用它來(lái)進(jìn)行多變量回歸分析。
但是,由于該函數(shù)的目的是為了執(zhí)行專門的任務(wù),所以當(dāng)我們遇到簡(jiǎn)單的線性回歸分析時(shí),這是最快速的方法之一。
除了已擬合的系數(shù)和截距項(xiàng)(intercept term)外,它還會(huì)返回基本的統(tǒng)計(jì)學(xué)值如 R² 系數(shù)與標(biāo)準(zhǔn)差。
本質(zhì)上,std_err應(yīng)該為梯度中表示的每個(gè)系數(shù)給出一個(gè)值。
簡(jiǎn)單來(lái)說(shuō),std_err就是告訴您數(shù)據(jù)的梯度擬合度(數(shù)值越高表示精度越低),不是傳統(tǒng)統(tǒng)計(jì)中的標(biāo)準(zhǔn)差。
3. 兩個(gè)方法對(duì)比
分別隨機(jī)取10、100、1000、10000組數(shù)據(jù)對(duì)比計(jì)算速度。
附代碼:
import pandas as pd import datetime import numpy as np import random from scipy import stats x =[i for i in range(10)] y =[j*random.random() + random.randint(2,6) for j in range(10)] print('start np.polyfit') now_time = datetime.datetime.now() time_str = datetime.datetime.strftime(now_time,'%Y-%m-%d %H:%M:%S.%f') print(time_str) p,V = np.polyfit(x, y, 1) ##std = np.var(y, ddof=1) #std = np.std(y, ddof=1) print(p,V) now_time = datetime.datetime.now() time_str = datetime.datetime.strftime(now_time,'%Y-%m-%d %H:%M:%S.%f') print(time_str) slope, intercept, r_value, p_value, std_err = stats.linregress(x, y) print(slope,intercept) now_time = datetime.datetime.now() time_str = datetime.datetime.strftime(now_time,'%Y-%m-%d %H:%M:%S.%f') print(time_str)
總結(jié)
polyfit()方法要比linregress()快,特別是單組數(shù)據(jù)量少時(shí),差距比較大。在做大數(shù)據(jù)線性回歸時(shí),如果單組數(shù)據(jù)量少于1000,可以多考慮polyfit()方法。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python操作MySQL數(shù)據(jù)庫(kù)的兩種方式實(shí)例分析【pymysql和pandas】
這篇文章主要介紹了Python操作MySQL數(shù)據(jù)庫(kù)的兩種方式,結(jié)合實(shí)例形式分析了Python使用pymysql和pandas模塊進(jìn)行mysql數(shù)據(jù)庫(kù)的連接、增刪改查等操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03Django實(shí)現(xiàn)網(wǎng)頁(yè)分頁(yè)功能
這篇文章主要介紹了Django實(shí)現(xiàn)網(wǎng)頁(yè)分頁(yè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10使用python裝飾器計(jì)算函數(shù)運(yùn)行時(shí)間的實(shí)例
下面小編就為大家分享一篇使用python裝飾器計(jì)算函數(shù)運(yùn)行時(shí)間的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04python3實(shí)現(xiàn)網(wǎng)頁(yè)版raspberry pi(樹(shù)莓派)小車控制
這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)網(wǎng)頁(yè)版raspberry pi(樹(shù)莓派)小車控制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02深入淺析NumPy庫(kù)中的numpy.diag()函數(shù)
通過(guò)本文的介紹,我們深入了解了NumPy庫(kù)中numpy.diag()函數(shù)的用法和應(yīng)用,從基本用法到高級(jí)特性,再到在線性代數(shù)中的應(yīng)用,我們逐步展示了numpy.diag()在處理對(duì)角矩陣和相關(guān)問(wèn)題時(shí)的強(qiáng)大功能,需要的朋友可以參考下2024-05-05通過(guò)cmd進(jìn)入python的實(shí)例操作
在本篇內(nèi)容中小編給大家分享了關(guān)于通過(guò)cmd怎么進(jìn)入python的實(shí)例操作方法和步驟,有需要的朋友們可以參考下。2019-06-06Python異常處理與反射相關(guān)問(wèn)題總結(jié)
今天給大家?guī)?lái)的是關(guān)于Python的相關(guān)知識(shí),文章圍繞著Python異常處理與反射展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06