1、背景知識1.1 插值、擬合、回歸和預測插值、擬合、回歸和預測,都是數(shù)學建模中經(jīng)常提到的概念,而且經(jīng)常會被混為一談。
因此,插值和擬合都是根據(jù)已知數(shù)據(jù)點求變化規(guī)律和特征相似的近似曲線的過程,但是插值要求近似曲線完全經(jīng)過給定的數(shù)據(jù)點,而擬合只要求近似曲線在整體上盡可能接近數(shù)據(jù)點,并反映數(shù)據(jù)的變化規(guī)律和發(fā)展趨勢。插值可以看作是一種特殊的擬合,是要求誤差函數(shù)為 0的擬合。由于數(shù)據(jù)點通常都帶有誤差,誤差為 0 往往意味著過擬合,過擬合模型對于訓練集以外的數(shù)據(jù)的泛化能力是較差的。因此在實踐中,插值多用于圖像處理,擬合多用于實驗數(shù)據(jù)處理。
回歸是一種數(shù)據(jù)分析方法,擬合是一種具體的數(shù)據(jù)處理方法。擬合側(cè)重于曲線參數(shù)尋優(yōu),使曲線與數(shù)據(jù)相符;而回歸側(cè)重于研究兩個或多個變量之間的關(guān)系。 歡迎關(guān)注 Youcans 原創(chuàng)系列,每周更新數(shù)模筆記 Python數(shù)模筆記-PuLP庫 1.2 線性回歸回歸分析(Regression analysis)是一種統(tǒng)計分析方法,研究是自變量和因變量之間的定量關(guān)系,經(jīng)常用于預測分析、時間序列模型以及發(fā)現(xiàn)變量之間的因果關(guān)系。按照變量之間的關(guān)系類型,回歸分析可以分為線性回歸和非線性回歸。 線性回歸(Linear regression) 假設(shè)給定數(shù)據(jù)集中的目標(y)與特征(X)存在線性關(guān)系,即滿足一個多元一次方程 。 回歸分析中,只包括一個自變量和一個因變量,且二者的關(guān)系可用一條直線近似表示,稱為一元線性回歸;如果包括兩個或多個的自變量,且因變量和自變量之間是線性關(guān)系,則稱為多元線性回歸。 進一步地,還需要分析對于樣本數(shù)據(jù)究竟能不能采用線性回歸方法,或者說線性相關(guān)的假設(shè)是否合理、線性模型是否具有良好的穩(wěn)定性?這就需要使用統(tǒng)計分析進行顯著性檢驗,檢驗因變量與自變量之間的線性關(guān)系是否顯著,用線性模型來描述它們之間的關(guān)系是否恰當。 2、Statsmodels 進行線性回歸本節(jié)結(jié)合 Statsmodels 統(tǒng)計分析包 的使用介紹線性擬合和回歸分析。線性模型可以表達為如下公式: 2.1 導入工具包
2.2 導入樣本數(shù)據(jù)樣本數(shù)據(jù)通常保存在數(shù)據(jù)文件中,因此要讀取數(shù)據(jù)文件獲得樣本數(shù)據(jù)。為便于閱讀和測試程序,本文使用隨機數(shù)生成樣本數(shù)據(jù)。讀取數(shù)據(jù)文件導入數(shù)據(jù)的方法,將在后文介紹。
本案例是一元線性回歸問題,(yTest,x)是導入的樣本數(shù)據(jù),我們需要通過線性回歸獲得因變量 y 與自變量 x 之間的定量關(guān)系。yTrue 是理想模型的數(shù)值,yTest 模擬實驗檢測的數(shù)據(jù),在理想模型上加入了正態(tài)分布的隨機誤差。 2.3 建模與擬合 一元線性回歸模型方程為:
statsmodels.OLS 是 statsmodels.regression.linear_model 的函數(shù),有 4個參數(shù) (endog, exog, missing, hasconst)。 第一個參數(shù) endog 是回歸模型中的因變量 y(t), 是1-d array 數(shù)據(jù)類型。 第二個輸入 exog 是自變量 x0(t),x1(t),…,xm(t),是(m+1)-d array 數(shù)據(jù)類型。 2.4 擬合和統(tǒng)計結(jié)果的輸出Statsmodels 進行線性回歸分析的輸出結(jié)果非常豐富,results.summary() 返回了回歸分析的摘要。
摘要所返回的內(nèi)容非常豐富,這里先討論最重要的一些結(jié)果,在 summary 的中間段落。 ============================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------const 2.4669 0.186 13.230 0.000 2.097 2.837x1 1.5883 0.032 49.304 0.000 1.524 1.652 ==============================================================================
Statsmodels 也可以通過屬性獲取所需的回歸分析的數(shù)據(jù),例如:
3、一元線性回歸3.1 一元線性回歸 Python 程序:# LinearRegression_v1.py# Linear Regression with statsmodels (OLS: Ordinary Least Squares)# v1.0: 調(diào)用 statsmodels 實現(xiàn)一元線性回歸# 日期:2021-05-04import numpy as npimport matplotlib.pyplot as pltimport statsmodels.api as smfrom statsmodels.sandbox.regression.predstd import wls_prediction_std# 主程序# === 關(guān)注 Youcans,分享更多原創(chuàng)系列 https://www.cnblogs.com/youcans/ ===def main(): # 主程序# 生成測試數(shù)據(jù):nSample = 100x1 = np.linspace(0, 10, nSample) # 起點為 0,終點為 10,均分為 nSample個點e = np.random.normal(size=len(x1)) # 正態(tài)分布隨機數(shù)yTrue = 2.36 + 1.58 * x1 # y = b0 + b1*x1yTest = yTrue + e # 產(chǎn)生模型數(shù)據(jù)# 一元線性回歸:最小二乘法(OLS)X = sm.add_constant(x1) # 向矩陣 X 添加截距列(x0=[1,...1])model = sm.OLS(yTest, X) # 建立最小二乘模型(OLS)results = model.fit() # 返回模型擬合結(jié)果yFit = results.fittedvalues # 模型擬合的 y值prstd, ivLow, ivUp = wls_prediction_std(results) # 返回標準偏差和置信區(qū)間# OLS model: Y = b0 + b1*X + eprint(results.summary()) # 輸出回歸分析的摘要print("\nOLS model: Y = b0 + b1 * x") # b0: 回歸直線的截距,b1: 回歸直線的斜率print('Parameters: ', results.params) # 輸出:擬合模型的系數(shù)# 繪圖:原始數(shù)據(jù)點,擬合曲線,置信區(qū)間fig, ax = plt.subplots(figsize=(10, 8)) ax.plot(x1, yTest, 'o', label="data") # 原始數(shù)據(jù)ax.plot(x1, yFit, 'r-', label="OLS") # 擬合數(shù)據(jù)ax.plot(x1, ivUp, '--',color='orange',label="upConf") # 95% 置信區(qū)間 上限ax.plot(x1, ivLow, '--',color='orange',label="lowConf") # 95% 置信區(qū)間 下限ax.legend(loc='best') # 顯示圖例plt.title('OLS linear regression ') plt.show()returnif __name__ == '__main__': #YouCans, XUPTmain() 3.2 一元線性回歸 程序運行結(jié)果:OLS Regression Results ==============================================================================Dep. Variable: y R-squared: 0.961Model: OLS Adj. R-squared: 0.961Method: Least Squares F-statistic: 2431.Date: Wed, 05 May 2021 Prob (F-statistic): 5.50e-71Time: 16:24:22 Log-Likelihood: -134.62No. Observations: 100 AIC: 273.2Df Residuals: 98 BIC: 278.5Df Model: 1 Covariance Type: nonrobust ============================================================================== coef std err t P>|t| [0.025 0.975]------------------------------------------------------------------------------const 2.4669 0.186 13.230 0.000 2.097 2.837x1 1.5883 0.032 49.304 0.000 1.524 1.652==============================================================================Omnibus: 0.070 Durbin-Watson: 2.016Prob(Omnibus): 0.966 Jarque-Bera (JB): 0.187Skew: 0.056 Prob(JB): 0.911Kurtosis: 2.820 Cond. No. 11.7==============================================================================OLS model: Y = b0 + b1 * xParameters: [2.46688389 1.58832741] 4、多元線性回歸4.1 多元線性回歸 Python 程序:# LinearRegression_v2.py# Linear Regression with statsmodels (OLS: Ordinary Least Squares)# v2.0: 調(diào)用 statsmodels 實現(xiàn)多元線性回歸# 日期:2021-05-04import numpy as npimport matplotlib.pyplot as pltimport statsmodels.api as smfrom statsmodels.sandbox.regression.predstd import wls_prediction_std# 主程序# === 關(guān)注 Youcans,分享更多原創(chuàng)系列 https://www.cnblogs.com/youcans/ ===def main(): # 主程序# 生成測試數(shù)據(jù):nSample = 100x0 = np.ones(nSample) # 截距列 x0=[1,...1]x1 = np.linspace(0, 20, nSample) # 起點為 0,終點為 10,均分為 nSample個點x2 = np.sin(x1) x3 = (x1-5)**2X = np.column_stack((x0, x1, x2, x3)) # (nSample,4): [x0,x1,x2,...,xm]beta = [5., 0.5, 0.5, -0.02] # beta = [b1,b2,...,bm]yTrue = np.dot(X, beta) # 向量點積 y = b1*x1 + ...+ bm*xmyTest = yTrue + 0.5 * np.random.normal(size=nSample) # 產(chǎn)生模型數(shù)據(jù)# 多元線性回歸:最小二乘法(OLS)model = sm.OLS(yTest, X) # 建立 OLS 模型: Y = b0 + b1*X + ... + bm*Xm + eresults = model.fit() # 返回模型擬合結(jié)果yFit = results.fittedvalues # 模型擬合的 y值print(results.summary()) # 輸出回歸分析的摘要print("\nOLS model: Y = b0 + b1*X + ... + bm*Xm")print('Parameters: ', results.params) # 輸出:擬合模型的系數(shù) # 繪圖:原始數(shù)據(jù)點,擬合曲線,置信區(qū)間prstd, ivLow, ivUp = wls_prediction_std(results) # 返回標準偏差和置信區(qū)間fig, ax = plt.subplots(figsize=(10, 8)) ax.plot(x1, yTest, 'o', label="data") # 實驗數(shù)據(jù)(原始數(shù)據(jù)+誤差)ax.plot(x1, yTrue, 'b-', label="True") # 原始數(shù)據(jù)ax.plot(x1, yFit, 'r-', label="OLS") # 擬合數(shù)據(jù)ax.plot(x1, ivUp, '--',color='orange', label="ConfInt") # 置信區(qū)間 上屆ax.plot(x1, ivLow, '--',color='orange') # 置信區(qū)間 下屆ax.legend(loc='best') # 顯示圖例plt.xlabel('x') plt.ylabel('y') plt.show()returnif __name__ == '__main__': main() 4.2 多元線性回歸 程序運行結(jié)果:OLS Regression Results ==============================================================================Dep. Variable: y R-squared: 0.932 Model: OLS Adj. R-squared: 0.930 Method: Least Squares F-statistic: 440.0 Date: Thu, 06 May 2021 Prob (F-statistic): 6.04e-56 Time: 10:38:51 Log-Likelihood: -68.709 No. Observations: 100 AIC: 145.4 Df Residuals: 96 BIC: 155.8 Df Model: 3 Covariance Type: nonrobust ============================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------const 5.0411 0.120 41.866 0.000 4.802 5.280 x1 0.4894 0.019 26.351 0.000 0.452 0.526 x2 0.5158 0.072 7.187 0.000 0.373 0.658x3 -0.0195 0.002 -11.957 0.000 -0.023 -0.016 ==============================================================================Omnibus: 1.472 Durbin-Watson: 1.824 Prob(Omnibus): 0.479 Jarque-Bera (JB): 1.194 Skew: 0.011 Prob(JB): 0.551Kurtosis: 2.465 Cond. No. 223. ==============================================================================OLS model: Y = b0 + b1*X + ... + bm*Xm Parameters: [ 5.04111867 0.4893574 0.51579806 -0.01951219] 5、附錄:回歸結(jié)果詳細說明Dep.Variable: y 因變量Model:OLS 最小二乘模型Method: Least Squares 最小二乘No. Observations: 樣本數(shù)據(jù)的數(shù)量Df Residuals:殘差自由度(degree of freedom of residuals)Df Model:模型自由度(degree of freedom of model)Covariance Type:nonrobust 協(xié)方差陣的穩(wěn)健性R-squared:R 判定系數(shù)Adj. R-squared: 修正的判定系數(shù)F-statistic: 統(tǒng)計檢驗 F 統(tǒng)計量Prob (F-statistic): F檢驗的 P值Log likelihood: 對數(shù)似然coef:自變量和常數(shù)項的系數(shù),b1,b2,...bm,b0std err:系數(shù)估計的標準誤差t:統(tǒng)計檢驗 t 統(tǒng)計量P>|t|:t 檢驗的 P值[0.025, 0.975]:估計參數(shù)的 95%置信區(qū)間的下限和上限Omnibus:基于峰度和偏度進行數(shù)據(jù)正態(tài)性的檢驗Prob(Omnibus):基于峰度和偏度進行數(shù)據(jù)正態(tài)性的檢驗概率Durbin-Watson:檢驗殘差中是否存在自相關(guān)Skewness:偏度,反映數(shù)據(jù)分布的非對稱程度Kurtosis:峰度,反映數(shù)據(jù)分布陡峭或平滑程度Jarque-Bera(JB):基于峰度和偏度對數(shù)據(jù)正態(tài)性的檢驗Prob(JB):Jarque-Bera(JB)檢驗的 P值。Cond. No.:檢驗變量之間是否存在精確相關(guān)關(guān)系或高度相關(guān)關(guān)系。 版權(quán)說明: |
|
來自: LibraryPKU > 《科學計算》