sklearn實現非線性迴歸模型

sklearn實現非線性迴歸模型

前言: sklearn實現非線性迴歸模型的本質是通過線性模型實現非線性模型,如何實現呢?sklearn就是先將非線性模型轉換爲線性模型,再利用線性模型的算法進行訓練模型。

一、線性模型解決非線性模型的思想
1、樣本數據如下

x y
1 45000
2 50000
3 60000
4 80000
5 110000
6 150000
7 200000
8 300000
9 500000
10 1000000

2、假設樣本數據符合線性模型 y = a0 + a1x,則可以直接利用sklearn的線性迴歸模型方法訓練該模型

3、但是假設樣本數據符合非線性模型 y = a0x0 + a1x1 + a2x2 + a3x3 ,(其中x0=1)那麼我們如何將該非線性模型轉爲線性模型呢?sklearn的解釋思路是從樣本數據中的自變量下手的,它首先通過計算將樣本數據修改爲下表
x0 x1 x2 x3 y
[[ 1. 1. 1. 1.]
[ 1. 2. 4. 8.]
[ 1. 3. 9. 27.]
[ 1. 4. 16. 64.]
[ 1. 5. 25. 125.]
[ 1. 6. 36. 216.]
[ 1. 7. 49. 343.]
[ 1. 8. 64. 512.]
[ 1. 9. 81. 729.]
[ 1. 10. 100. 1000.]]
4、根據上面的樣本數據,也就把 y = a0x0 + a1x1 + a2x2 + a3x3 ^非線性迴歸模型轉換爲了y = a0x0 + a01x1 + a2x2 + a3x3的線性迴歸模型了,這樣就可以利用sklearn的線性迴歸模型算法進行訓練非線性迴歸模型了

二、 具體實現代碼如下

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

# 讀取數據
data = np.genfromtxt('job.csv', delimiter=',')
x_data = data[1:, 1]
y_data = data[1:, 2]

# 一維數據通過增加維度轉爲二維數據
x_2data = x_data[:, np.newaxis]
y_2data = data[1:, 2, np.newaxis]

# 訓練一元線性模型
model = LinearRegression()
model.fit(x_2data, y_2data)

plt.plot(x_2data, y_2data, 'b.')
plt.plot(x_2data, model.predict(x_2data), 'r')

# 定義多項式迴歸:其本質是將變量x,根據degree的值轉換爲相應的多項式(非線性迴歸),eg: degree=3,則迴歸模型
# 變爲 y = theta0 + theta1 * x + theta2 * x^2 + theta3 * x^3
poly_reg = PolynomialFeatures(degree=3)
# 特徵處理
x_ploy = poly_reg.fit_transform(x_2data)  # 這個方法實質是把非線性的模型轉爲線性模型進行處理,
# 處理方法就是把多項式每項的樣本數據根據冪次數計算出相應的樣本值(詳細理解可以參考我的博文:https://blog.csdn.net/qq_34720818/article/details/103349452)

# 訓練線性模型(其本質是非線性模型,是由非線性模型轉換而來)
lin_reg_model = LinearRegression()
lin_reg_model.fit(x_ploy, y_2data)

plt.plot(x_2data, y_2data, 'b.')
plt.plot(x_2data, lin_reg_model.predict(x_ploy), 'r')

plt.show()

三、實現結果
在這裏插入圖片描述

可以很明顯的看錯曲線比直線的擬合效果好

四、數據下載
鏈接:https://pan.baidu.com/s/1YoUUJkbSGQsyy50m-LQJYw
提取碼:rwek

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章