pytorch實(shí)現(xiàn)多項(xiàng)式回歸
pytorch實(shí)現(xiàn)多項(xiàng)式回歸,供大家參考,具體內(nèi)容如下
一元線性回歸模型雖然能擬合出一條直線,但精度依然欠佳,擬合的直線并不能穿過每個(gè)點(diǎn),對(duì)于復(fù)雜的擬合任務(wù)需要多項(xiàng)式回歸擬合,提高精度。多項(xiàng)式回歸擬合就是將特征的次數(shù)提高,線性回歸的次數(shù)使一次的,實(shí)際我們可以使用二次、三次、四次甚至更高的次數(shù)進(jìn)行擬合。由于模型的復(fù)雜度增加會(huì)帶來過擬合的風(fēng)險(xiǎn),因此需要采取正則化損失的方式減少過擬合,提高模型泛化能力。希望大家可以自己動(dòng)手,通過一些小的訓(xùn)練掌握pytorch(案例中有些觀察數(shù)據(jù)格式的代碼,大家可以自己注釋掉)
# 相較于一元線性回歸模型,多項(xiàng)式回歸可以很好的提高擬合精度,但要注意過擬合風(fēng)險(xiǎn)
# 多項(xiàng)式回歸方程 f(x) = -1.13x-2.14x^2+3.12x^3-0.01x^4+0.512
import torch
import matplotlib.pyplot as plt
import numpy as np
# 數(shù)據(jù)準(zhǔn)備(測試數(shù)據(jù))
x = torch.linspace(-2,2,50)
print(x.shape)
y = -1.13*x - 2.14*torch.pow(x,2) + 3.15*torch.pow(x,3) - 0.01*torch.pow(x,4) + 0.512
plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()
# 此時(shí)輸入維度為4維
# 為了拼接輸入數(shù)據(jù),需要編寫輔助數(shù)據(jù),輸入標(biāo)量x,使其變?yōu)榫仃嚕褂胻orch.cat拼接
def features(x): # 生成矩陣
# [x,x^2,x^3,x^4]
x = x.unsqueeze(1)
print(x.shape)
return torch.cat([x ** i for i in range(1,5)], 1)
result = features(x)
print(result.shape)
# 目標(biāo)公式用于計(jì)算輸入特征對(duì)應(yīng)的標(biāo)準(zhǔn)輸出
# 目標(biāo)公式的權(quán)重如下
x_weight = torch.Tensor([-1.13,-2.14,3.15,-0.01]).unsqueeze(1)
b = torch.Tensor([0.512])
# 得到x數(shù)據(jù)對(duì)應(yīng)的標(biāo)準(zhǔn)輸出
def target(x):
return x.mm(x_weight) + b.item()
# 新建一個(gè)隨機(jī)生成輸入數(shù)據(jù)和輸出數(shù)據(jù)的函數(shù),用于生成訓(xùn)練數(shù)據(jù)
def get_batch_data(batch_size):
# 生成batch_size個(gè)隨機(jī)的x
batch_x = torch.randn(batch_size)
# 對(duì)于每個(gè)x要生成一個(gè)矩陣
features_x = features(batch_x)
target_y = target(features_x)
return features_x,target_y
# 創(chuàng)建模型
class PolynomialRegression(torch.nn.Module):
def __init__(self):
super(PolynomialRegression, self).__init__()
# 輸入四維度 輸出一維度
self.poly = torch.nn.Linear(4,1)
def forward(self, x):
return self.poly(x)
# 開始訓(xùn)練模型
epochs = 10000
batch_size = 32
model = PolynomialRegression()
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(),0.001)
for epoch in range(epochs):
print("{}/{}".format(epoch+1,epochs))
batch_x,batch_y = get_batch_data(batch_size)
out = model(batch_x)
loss = criterion(out,batch_y)
optimizer.zero_grad()
loss.backward()
# 更新梯度
optimizer.step()
if (epoch % 100 == 0):
print("Epoch:[{}/{}],loss:{:.6f}".format(epoch,epochs,loss.item()))
if (epoch % 1000 == 0):
predict = model(features(x))
print(x.shape)
print(predict.shape)
print(predict.squeeze(1).shape)
plt.plot(x.data.numpy(),predict.squeeze(1).data.numpy(),"r")
loss = criterion(predict,y)
plt.title("Loss:{:.4f}".format(loss.item()))
plt.xlabel("X")
plt.ylabel("Y")
plt.scatter(x,y)
plt.show()
擬合結(jié)果:




以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python樹的雙親存儲(chǔ)結(jié)構(gòu)的實(shí)現(xiàn)示例
本文主要介紹了python樹的雙親存儲(chǔ)結(jié)構(gòu),這種存儲(chǔ)結(jié)構(gòu)是一種順序存儲(chǔ)結(jié)構(gòu),采用元素形如“[結(jié)點(diǎn)值,雙親結(jié)點(diǎn)索引]”的列表表示,感興趣的可以了解一下2023-11-11
python使用lxml xpath模塊解析XML遇到的坑及解決
這篇文章主要介紹了python使用lxml xpath模塊解析XML遇到的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
快速排序的算法思想及Python版快速排序的實(shí)現(xiàn)示例
快速排序算法來源于分治法的思想策略,這里我們將來為大家簡單解析一下快速排序的算法思想及Python版快速排序的實(shí)現(xiàn)示例:2016-07-07
使用keras實(shí)現(xiàn)densenet和Xception的模型融合
這篇文章主要介紹了使用keras實(shí)現(xiàn)densenet和Xception的模型融合,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python猜解網(wǎng)站數(shù)據(jù)庫管理員密碼的腳本
這篇文章主要和大家分享一個(gè)Python腳本,可以實(shí)現(xiàn)猜解網(wǎng)站數(shù)據(jù)庫管理員的密碼。文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下2022-02-02
詳解Python中高階函數(shù)(map,filter,reduce,sorted)的使用
高階函數(shù)就是能夠把函數(shù)當(dāng)成參數(shù)傳遞的函數(shù)就是高階函數(shù),換句話說如果一個(gè)函數(shù)的參數(shù)是函數(shù),那么這個(gè)函數(shù)就是一個(gè)高階函數(shù)。本文為大家詳細(xì)講解了Python中常用的四個(gè)高階函數(shù),感興趣的可以了解一下2022-04-04
通過Python腳本+Jenkins實(shí)現(xiàn)項(xiàng)目重啟
Jenkins是一個(gè)流行的開源自動(dòng)化服務(wù)器,用于快速構(gòu)建、測試和部署軟件,本文主要介紹了通過Python腳本+Jenkins實(shí)現(xiàn)項(xiàng)目重啟,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10

