關(guān)于numpy.polyfit()與Stats.linregress()方法最小二乘近似擬合斜率對比
numpy.polyfit()與Stats.linregress()方法最小二乘近似擬合斜率對比
對于大多數(shù)數(shù)據(jù)科學(xué)家而言,線性回歸方法是他們進(jìn)行統(tǒng)計學(xué)建模和預(yù)測分析任務(wù)的起點。
而快速且準(zhǔn)確地線性回歸模型對擬合大型數(shù)據(jù)集非常重要性。
由于在機(jī)器學(xué)習(xí)中,Scikit-learn 是一個十分流行的 Python 庫,因此,人們經(jīng)常會從這個庫調(diào)用線性模型來擬合數(shù)據(jù)。
除此之外,我們還可以使用該庫的 pipeline 與 FeatureUnion 功能(如:數(shù)據(jù)歸一化、模型回歸系數(shù)正則化、將線性模型傳遞給下游模型),但是一般來看,如果一個數(shù)據(jù)分析師僅需要一個又快又簡單的方法來確定回歸系數(shù)(或是一些相關(guān)的統(tǒng)計學(xué)基本結(jié)果),那么這并不是最快或最簡潔的方法。
接下來,我們研究兩個更快更簡潔的方法。
1. numpy.polyfit()方法

這是一個非常一般的最小二乘多項式擬合函數(shù),它適用于任何 degree 的數(shù)據(jù)集與多項式函數(shù)(具體由用戶來指定),其返回值是一個(最小化方差)回歸系數(shù)的數(shù)組。
對于簡單的線性回歸而言,你可以把 degree 設(shè)為 1。如果你想擬合一個 degree 更高的模型,你也可以通過從線性特征數(shù)據(jù)中建立多項式特征來完成。
2. Stats.linregress( ) 方法

這是 Scipy 中的統(tǒng)計模塊中的一個高度專門化的線性回歸函數(shù)。
其靈活性相當(dāng)受限,因為它只對計算兩組測量值的最小二乘回歸進(jìn)行優(yōu)化。
因此,你不能用它擬合一般的線性模型,或者是用它來進(jìn)行多變量回歸分析。
但是,由于該函數(shù)的目的是為了執(zhí)行專門的任務(wù),所以當(dāng)我們遇到簡單的線性回歸分析時,這是最快速的方法之一。
除了已擬合的系數(shù)和截距項(intercept term)外,它還會返回基本的統(tǒng)計學(xué)值如 R² 系數(shù)與標(biāo)準(zhǔn)差。
本質(zhì)上,std_err應(yīng)該為梯度中表示的每個系數(shù)給出一個值。
簡單來說,std_err就是告訴您數(shù)據(jù)的梯度擬合度(數(shù)值越高表示精度越低),不是傳統(tǒng)統(tǒng)計中的標(biāo)準(zhǔn)差。
3. 兩個方法對比

分別隨機(jī)取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)文章
pyinstaller打包可執(zhí)行文件出現(xiàn)KeyError的問題
這篇文章主要介紹了pyinstaller打包可執(zhí)行文件出現(xiàn)KeyError的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
在VS2017中用C#調(diào)用python腳本的實現(xiàn)
這篇文章主要介紹了在VS2017中用C#調(diào)用python腳本的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python繞過圖片滑動驗證碼實現(xiàn)爬取PTA所有題目功能 附源碼
這篇文章主要介紹了python繞過圖片滑動驗證碼實現(xiàn)爬取PTA所有題目 附源碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Python圖像處理之目標(biāo)物體輪廓提取的實現(xiàn)方法
目標(biāo)物體的輪廓實質(zhì)是指一系列像素點構(gòu)成,這些點構(gòu)成了一個有序的點集,這篇文章主要給大家介紹了關(guān)于Python圖像處理之目標(biāo)物體輪廓提取的實現(xiàn)方法,需要的朋友可以參考下2021-08-08

