關(guān)于numpy.polyfit()與Stats.linregress()方法最小二乘近似擬合斜率對比
numpy.polyfit()與Stats.linregress()方法最小二乘近似擬合斜率對比
對于大多數(shù)數(shù)據(jù)科學家而言,線性回歸方法是他們進行統(tǒng)計學建模和預(yù)測分析任務(wù)的起點。
而快速且準確地線性回歸模型對擬合大型數(shù)據(jù)集非常重要性。
由于在機器學習中,Scikit-learn 是一個十分流行的 Python 庫,因此,人們經(jīng)常會從這個庫調(diào)用線性模型來擬合數(shù)據(jù)。
除此之外,我們還可以使用該庫的 pipeline 與 FeatureUnion 功能(如:數(shù)據(jù)歸一化、模型回歸系數(shù)正則化、將線性模型傳遞給下游模型),但是一般來看,如果一個數(shù)據(jù)分析師僅需要一個又快又簡單的方法來確定回歸系數(shù)(或是一些相關(guān)的統(tǒng)計學基本結(jié)果),那么這并不是最快或最簡潔的方法。
接下來,我們研究兩個更快更簡潔的方法。
1. numpy.polyfit()方法
這是一個非常一般的最小二乘多項式擬合函數(shù),它適用于任何 degree 的數(shù)據(jù)集與多項式函數(shù)(具體由用戶來指定),其返回值是一個(最小化方差)回歸系數(shù)的數(shù)組。
對于簡單的線性回歸而言,你可以把 degree 設(shè)為 1。如果你想擬合一個 degree 更高的模型,你也可以通過從線性特征數(shù)據(jù)中建立多項式特征來完成。
2. Stats.linregress( ) 方法
這是 Scipy 中的統(tǒng)計模塊中的一個高度專門化的線性回歸函數(shù)。
其靈活性相當受限,因為它只對計算兩組測量值的最小二乘回歸進行優(yōu)化。
因此,你不能用它擬合一般的線性模型,或者是用它來進行多變量回歸分析。
但是,由于該函數(shù)的目的是為了執(zhí)行專門的任務(wù),所以當我們遇到簡單的線性回歸分析時,這是最快速的方法之一。
除了已擬合的系數(shù)和截距項(intercept term)外,它還會返回基本的統(tǒng)計學值如 R² 系數(shù)與標準差。
本質(zhì)上,std_err應(yīng)該為梯度中表示的每個系數(shù)給出一個值。
簡單來說,std_err就是告訴您數(shù)據(jù)的梯度擬合度(數(shù)值越高表示精度越低),不是傳統(tǒng)統(tǒng)計中的標準差。
3. 兩個方法對比
分別隨機取10、100、1000、10000組數(shù)據(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ù)據(jù)線性回歸時,如果單組數(shù)據(jù)量少于1000,可以多考慮polyfit()方法。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python操作MySQL數(shù)據(jù)庫的兩種方式實例分析【pymysql和pandas】
這篇文章主要介紹了Python操作MySQL數(shù)據(jù)庫的兩種方式,結(jié)合實例形式分析了Python使用pymysql和pandas模塊進行mysql數(shù)據(jù)庫的連接、增刪改查等操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2019-03-03python3實現(xiàn)網(wǎng)頁版raspberry pi(樹莓派)小車控制
這篇文章主要為大家詳細介紹了python3實現(xiàn)網(wǎng)頁版raspberry pi(樹莓派)小車控制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02深入淺析NumPy庫中的numpy.diag()函數(shù)
通過本文的介紹,我們深入了解了NumPy庫中numpy.diag()函數(shù)的用法和應(yīng)用,從基本用法到高級特性,再到在線性代數(shù)中的應(yīng)用,我們逐步展示了numpy.diag()在處理對角矩陣和相關(guān)問題時的強大功能,需要的朋友可以參考下2024-05-05Python異常處理與反射相關(guān)問題總結(jié)
今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著Python異常處理與反射展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06