溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中怎么實現非線性回歸

發布時間:2021-07-02 15:48:09 來源:億速云 閱讀:2247 作者:Leah 欄目:大數據

Python中怎么實現非線性回歸

在數據分析和機器學習中,回歸分析是一種常用的統計方法,用于研究因變量與一個或多個自變量之間的關系。線性回歸是最簡單的回歸模型,但在實際應用中,很多情況下變量之間的關系并不是線性的,這時就需要使用非線性回歸模型。本文將介紹如何在Python中實現非線性回歸。

1. 什么是非線性回歸?

非線性回歸是指因變量與自變量之間的關系不能用線性方程來描述的情況。非線性回歸模型通??梢员硎緸椋?/p>

[ y = f(x, \beta) + \epsilon ]

其中,( y ) 是因變量,( x ) 是自變量,( \beta ) 是模型參數,( f ) 是非線性函數,( \epsilon ) 是誤差項。

非線性回歸模型可以捕捉到數據中更復雜的模式,因此在許多實際問題中比線性回歸模型更為適用。

2. Python中實現非線性回歸的常用方法

在Python中,實現非線性回歸的方法有很多,常用的方法包括:

  • 使用scipy.optimize.curve_fit函數
  • 使用statsmodels
  • 使用sklearn庫中的非線性回歸模型

下面我們將詳細介紹這些方法。

2.1 使用scipy.optimize.curve_fit函數

scipy.optimize.curve_fitscipy庫中的一個函數,用于擬合非線性模型。它基于最小二乘法,通過最小化殘差平方和來估計模型參數。

2.1.1 示例代碼

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# 定義非線性函數
def func(x, a, b, c):
    return a * np.exp(-b * x) + c

# 生成模擬數據
xdata = np.linspace(0, 4, 50)
y = func(xdata, 2.5, 1.3, 0.5)
np.random.seed(1729)
y_noise = 0.2 * np.random.normal(size=xdata.size)
ydata = y + y_noise

# 使用curve_fit擬合數據
popt, pcov = curve_fit(func, xdata, ydata)

# 輸出擬合參數
print("擬合參數:", popt)

# 繪制擬合曲線
plt.plot(xdata, ydata, 'b-', label='data')
plt.plot(xdata, func(xdata, *popt), 'r-', label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

2.1.2 代碼解釋

  • func函數定義了一個非線性模型,這里使用的是指數函數。
  • xdataydata是模擬數據,ydata加入了噪聲。
  • curve_fit函數用于擬合數據,返回擬合參數popt和協方差矩陣pcov。
  • 最后繪制了原始數據和擬合曲線。

2.2 使用statsmodels

statsmodels是一個強大的統計建模庫,支持多種回歸模型,包括非線性回歸。

2.2.1 示例代碼

import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

# 定義非線性函數
def func(x, a, b, c):
    return a * np.exp(-b * x) + c

# 生成模擬數據
xdata = np.linspace(0, 4, 50)
y = func(xdata, 2.5, 1.3, 0.5)
np.random.seed(1729)
y_noise = 0.2 * np.random.normal(size=xdata.size)
ydata = y + y_noise

# 使用statsmodels進行非線性回歸
model = sm.OLS(ydata, sm.add_constant(func(xdata, 1, 1, 1)))
results = model.fit()

# 輸出擬合結果
print(results.summary())

# 繪制擬合曲線
plt.plot(xdata, ydata, 'b-', label='data')
plt.plot(xdata, results.fittedvalues, 'r-', label='fit')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

2.2.2 代碼解釋

  • func函數定義了一個非線性模型。
  • xdataydata是模擬數據,ydata加入了噪聲。
  • sm.OLS用于創建普通最小二乘模型,sm.add_constant用于添加常數項。
  • results.fit()進行擬合,并輸出擬合結果。
  • 最后繪制了原始數據和擬合曲線。

2.3 使用sklearn庫中的非線性回歸模型

sklearn庫主要用于機器學習,雖然它本身不直接支持非線性回歸,但可以通過多項式回歸或核方法來實現非線性回歸。

2.3.1 示例代碼

import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

# 生成模擬數據
xdata = np.linspace(0, 4, 50)
ydata = 2.5 * np.exp(-1.3 * xdata) + 0.5
np.random.seed(1729)
y_noise = 0.2 * np.random.normal(size=xdata.size)
ydata = ydata + y_noise

# 將數據轉換為多項式特征
poly = PolynomialFeatures(degree=3)
xdata_poly = poly.fit_transform(xdata.reshape(-1, 1))

# 使用線性回歸擬合多項式特征
model = LinearRegression()
model.fit(xdata_poly, ydata)

# 輸出擬合結果
print("系數:", model.coef_)
print("截距:", model.intercept_)

# 繪制擬合曲線
plt.plot(xdata, ydata, 'b-', label='data')
plt.plot(xdata, model.predict(xdata_poly), 'r-', label='fit')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

2.3.2 代碼解釋

  • PolynomialFeatures用于將數據轉換為多項式特征。
  • LinearRegression用于擬合多項式特征。
  • 最后繪制了原始數據和擬合曲線。

3. 總結

本文介紹了在Python中實現非線性回歸的三種常用方法:使用scipy.optimize.curve_fit函數、使用statsmodels庫和使用sklearn庫中的非線性回歸模型。每種方法都有其適用的場景,選擇合適的方法可以提高模型的擬合效果。希望本文能幫助你在實際項目中更好地應用非線性回歸模型。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女