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 中將二進(jìn)制轉(zhuǎn)換為整數(shù)的多種方法
這篇文章主要介紹了Python 中將二進(jìn)制轉(zhuǎn)換為整數(shù),Python 中提供了多種方式將二進(jìn)制字符串轉(zhuǎn)換為整數(shù),其中包括使用 int() 函數(shù)、使用二進(jìn)制前綴和使用 eval() 函數(shù),本文通過(guò)實(shí)例代碼講解的非常詳細(xì),需要的朋友可以參考下2023-05-05
對(duì)Python新手編程過(guò)程中如何規(guī)避一些常見(jiàn)問(wèn)題的建議
這篇文章中作者對(duì)Python新手編程過(guò)程中如何規(guī)避一些常見(jiàn)問(wèn)題給出了建議,主要著眼于初學(xué)者對(duì)于一些常用函數(shù)方法在平時(shí)的使用習(xí)慣中的問(wèn)題給出建議,需要的朋友可以參考下2015-04-04
cython加速python代碼的方法實(shí)現(xiàn)
本文主要介紹了cython加速python代碼的方法實(shí)現(xiàn),特別是在涉及到數(shù)值計(jì)算密集型任務(wù)時(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
python利用while求100內(nèi)的整數(shù)和方式
這篇文章主要介紹了 python利用while求100內(nèi)的整數(shù)和方式,下面文章要描述的內(nèi)容有1到100的和、1到100內(nèi)的偶數(shù)和、1到100內(nèi)的奇數(shù)和,具體詳細(xì)內(nèi)容,需要的朋友可以參考一下2021-11-11
解決python中 f.write寫(xiě)入中文出錯(cuò)的問(wèn)題
今天小編就為大家分享一篇解決python中 f.write寫(xiě)入中文出錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
淺談python數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)規(guī)劃
這篇文章主要介紹了淺談python數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)規(guī)劃,可能很多小伙伴會(huì)覺(jué)得這個(gè)詞很陌生,覺(jué)得這是一種很復(fù)雜的思想,學(xué)習(xí)起來(lái)很困難,其實(shí)并不是這樣,動(dòng)態(tài)規(guī)劃所講述的知識(shí)與動(dòng)態(tài)與規(guī)劃并無(wú)太大關(guān)聯(lián),需要的朋友可以參考下2023-07-07
Python的Scrapy爬蟲(chóng)框架簡(jiǎn)單學(xué)習(xí)筆記
這篇文章主要介紹了Python的Scrapy爬蟲(chóng)框架簡(jiǎn)單學(xué)習(xí)筆記,從基本的創(chuàng)建項(xiàng)目到CrawlSpider的使用等都有涉及,需要的朋友可以參考下2016-01-01

