Python實(shí)現(xiàn)多元線性回歸的梯度下降法
1. 讀取數(shù)據(jù)
首先要做的就是讀取數(shù)據(jù),請(qǐng)自行準(zhǔn)備一組適合做多元回歸的數(shù)據(jù)即可。這里以data.csv為例,這里做的是二元回歸。導(dǎo)入相關(guān)庫(kù),及相關(guān)代碼如下。
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D data = np.loadtxt("data.csv", delimiter=",") # 提取特征數(shù)據(jù)與標(biāo)簽 x_data = data[:,0:-1] y_data = data[:,-1]
2.定義代價(jià)函數(shù)
回歸模型形如:
接下來(lái)我們需要初始化相關(guān)參數(shù),并定義出代價(jià)函數(shù)。因?yàn)榇嬖诙鄠€(gè)系數(shù)參數(shù),這里代價(jià)函數(shù)的寫(xiě)法與一元回歸時(shí)的情況略有不同,稍微有所調(diào)整。具體如下:
# 初始化一系列參數(shù) # 截距 theta0 = 0 # 系數(shù) theta1 = 0 theta2 = 0 # 學(xué)習(xí)率 learning_rate = 0.0001 # 初始化迭代次數(shù) n_iterables = 1000 # 定義代價(jià)函數(shù)(損失函數(shù)) def compute_mse(theta0, theta1, theta2, x_data, y_data): total_error = 0 for i in range(len(x_data)): # 計(jì)算損失 真實(shí)值:y_data 預(yù)測(cè)值h(x)=theta0 + theta1*x1 + theta2*x2 total_error += (y_data[i] - (theta0 + theta1 * x_data[i, 0] + theta2 * x_data[i, 1])) ** 2 mse_ = total_error / len(x_data) / 2 return mse_
3. 梯度下降
多元回歸的梯度下降與一元回歸的差不多,在一元回歸中只需要求一個(gè)導(dǎo)數(shù),而現(xiàn)在求多個(gè)偏導(dǎo)數(shù)。代碼過(guò)程如下:
def gradient_descent(x_data, y_data, theta0, theta1, theta2, learning_rate, n_iterables): m = len(x_data) # 循環(huán) --> 迭代次數(shù) for i in range(n_iterables): # 初始化 theta0 theta1 theta2 的偏導(dǎo)值 theta0_grad = 0 theta1_grad = 0 theta2_grad = 0 # 計(jì)算偏導(dǎo)的總和再平均 # 遍歷m次 for j in range(m): theta0_grad += (1 / m) * ((theta1 * x_data[j, 0] + theta2 * x_data[j, 1] + theta0) - y_data[j]) theta1_grad += (1 / m) * ((theta1 * x_data[j, 0] + theta2 * x_data[j, 1] + theta0) - y_data[j]) * x_data[ j, 0] theta2_grad += (1 / m) * ((theta1 * x_data[j, 0] + theta2 * x_data[j, 1] + theta0) - y_data[j]) * x_data[ j, 1] # 更新theta theta0 = theta0 - (learning_rate * theta0_grad) theta1 = theta1 - (learning_rate * theta1_grad) theta2 = theta2 - (learning_rate * theta2_grad) return theta0, theta1, theta2 print(f"開(kāi)始:截距theta0={theta0},theta1={theta1},theta2={theta2},損失={compute_mse(theta0,theta1,theta2,x_data,y_data)}") print("開(kāi)始運(yùn)行") theta0,theta1,theta2 = gradient_descent(x_data,y_data,theta0,theta1,theta2,learning_rate,n_iterables) print(f"迭代{n_iterables}次后:截距theta0={theta0},theta1={theta1},theta2={theta2},損失={compute_mse(theta0,theta1,theta2,x_data,y_data)}")
執(zhí)行結(jié)果輸出如下:
1000次迭代之后,損失值由23.64變?yōu)?.3865。
4.可視化展示
可視化展示常常作為機(jī)器學(xué)習(xí)過(guò)程的補(bǔ)充,可以使得機(jī)器學(xué)習(xí)的效果更為生動(dòng),直觀。
# 可視化散點(diǎn)分布 fig = plt.figure() ax = Axes3D(fig) ax.scatter(x_data[:,0],x_data[:,1],y_data) plt.show() # 可視化散點(diǎn)分布 fig = plt.figure() ax = Axes3D(fig) ax.scatter(x_data[:,0],x_data[:,1],y_data) # 繪制預(yù)期平面 # 構(gòu)建x x_0 = x_data[:,0] x_1 = x_data[:,1] # 生成網(wǎng)格矩陣 x_0,x_1 = np.meshgrid(x_0,x_1) y_hat = theta0 + theta1*x_0 + theta2*x_1 # 繪制3D圖 ax.plot_surface(x_0,x_1,y_hat) # 設(shè)置標(biāo)簽 ax.set_xlabel("Miles") ax.set_ylabel("nums") ax.set_zlabel("Time") plt.show()
散點(diǎn)圖輸出如下:
加上擬合回歸面后如圖所示:
到此這篇關(guān)于Python實(shí)現(xiàn)多元線性回歸的梯度下降法的文章就介紹到這了,更多相關(guān)Python梯度下降法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python實(shí)現(xiàn)線性回歸算法
- python深度總結(jié)線性回歸
- python機(jī)器學(xué)習(xí)基礎(chǔ)線性回歸與嶺回歸算法詳解
- Python線性回歸圖文實(shí)例詳解
- python實(shí)現(xiàn)線性回歸的示例代碼
- python數(shù)據(jù)分析之線性回歸選擇基金
- python基于numpy的線性回歸
- Python構(gòu)建簡(jiǎn)單線性回歸模型
- Python反向傳播實(shí)現(xiàn)線性回歸步驟詳細(xì)講解
- python繪制y關(guān)于x的線性回歸線性方程圖像實(shí)例
- python實(shí)現(xiàn)線性回歸的示例代碼
相關(guān)文章
Python 多線程C段掃描、檢測(cè) Ping掃描腳本的實(shí)現(xiàn)
這篇文章主要介紹了Python 多線程C段掃描、檢測(cè) Ping掃描腳本的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Python新手入門(mén)最容易犯的錯(cuò)誤總結(jié)
這篇文章主要總結(jié)了一些關(guān)于Python新手入門(mén)最容易犯的錯(cuò)誤,希望通過(guò)學(xué)習(xí)本文總結(jié)的十二點(diǎn)易犯錯(cuò)誤點(diǎn),能夠給新手們帶來(lái)一定的幫助,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-04-04Python實(shí)現(xiàn)隨機(jī)創(chuàng)建電話號(hào)碼的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)隨機(jī)創(chuàng)建電話號(hào)碼的方法,涉及Python隨機(jī)數(shù)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2018-12-12Python統(tǒng)計(jì)詞頻的幾種方法小結(jié)
本文主要介紹了Python統(tǒng)計(jì)詞頻的幾種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Python tensorflow實(shí)現(xiàn)mnist手寫(xiě)數(shù)字識(shí)別示例【非卷積與卷積實(shí)現(xiàn)】
這篇文章主要介紹了Python tensorflow實(shí)現(xiàn)mnist手寫(xiě)數(shù)字識(shí)別,結(jié)合實(shí)例形式分析了基于tensorflow模塊使用非卷積與卷積算法實(shí)現(xiàn)手寫(xiě)數(shù)字識(shí)別的具體操作技巧,需要的朋友可以參考下2019-12-12使用Python的turtle模塊畫(huà)國(guó)旗
這篇文章主要為大家詳細(xì)介紹了用Python的turtle模塊畫(huà)國(guó)旗,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Python?PaddleNLP開(kāi)源實(shí)現(xiàn)快遞單信息抽取
這篇文章主要為大家介紹了Python?PaddleNLP開(kāi)源項(xiàng)目實(shí)現(xiàn)對(duì)快遞單信息抽取,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Python使用pylab庫(kù)實(shí)現(xiàn)繪制直方圖功能示例
這篇文章主要介紹了Python使用pylab庫(kù)實(shí)現(xiàn)繪制直方圖功能,結(jié)合實(shí)例形式分析了Python數(shù)據(jù)讀取、遍歷以及基于pylab庫(kù)繪制直方圖的相關(guān)操作技巧,需要的朋友可以參考下2018-06-06python爬取網(wǎng)站數(shù)據(jù)保存使用的方法
這篇文章主要介紹了使用Python從網(wǎng)上爬取特定屬性數(shù)據(jù)保存的方法,其中解決了編碼問(wèn)題和如何使用正則匹配數(shù)據(jù)的方法,詳情看下文2013-11-11Python與Matlab實(shí)現(xiàn)快速傅里葉變化的區(qū)別
信號(hào)處理免不了要求頻率、畫(huà)頻譜圖,但Matlab的fft()函數(shù)與Python的numpy.fft.fft()與scipy.fftpack.fft()函數(shù)得到的是fft變化后的雙邊復(fù)數(shù)值,離畫(huà)頻譜圖還有幾句代碼的距離?;驹聿唤榻B了,下面直接懶人投喂,給出Matlab與Python的兩個(gè)函數(shù),直接調(diào)用即可畫(huà)頻譜圖2021-10-10