中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

PyTorch搭建多項式回歸模型(三)

發布時間:2020-10-10 17:25:39 來源:腳本之家 閱讀:162 作者:Liam Coder 欄目:開發技術

PyTorch基礎入門三:PyTorch搭建多項式回歸模型 

1)理論簡介

對于一般的線性回歸模型,由于該函數擬合出來的是一條直線,所以精度欠佳,我們可以考慮多項式回歸來擬合更多的模型。所謂多項式回歸,其本質也是線性回歸。也就是說,我們采取的方法是,提高每個屬性的次數來增加維度數。比如,請看下面這樣的例子:

如果我們想要擬合方程:

PyTorch搭建多項式回歸模型(三)

對于輸入變量PyTorch搭建多項式回歸模型(三)和輸出值PyTorch搭建多項式回歸模型(三),我們只需要增加其平方項、三次方項系數即可。所以,我們可以設置如下參數方程:

PyTorch搭建多項式回歸模型(三)

可以看到,上述方程與線性回歸方程并沒有本質區別。所以我們可以采用線性回歸的方式來進行多項式的擬合。下面請看代碼部分。

2)代碼實現

當然最先要做的就是導包了,下面需要說明的只有一個:itertools中的count,這個是用來記數用的,其可以記數到無窮,第一個參數是記數的起始值,第二個參數是步長。其內部實現相當于如下代碼:

def count(firstval=0, step=1):
 x = firstval
 while 1:
 yield x
 x += step

下面是導包部分代碼,這里定義了一個常量POLY_DEGREE = 3用來指定多項式最高次數。

from itertools import count
import torch
import torch.autograd
import torch.nn.functional as F
 
POLY_DEGREE = 3

然后我們需要將數據處理成矩陣的形式:

PyTorch搭建多項式回歸模型(三)

在PyTorch里面使用torch.cat()函數來實現Tensor的拼接:

def make_features(x):
 """Builds features i.e. a matrix with columns [x, x^2, x^3, x^4]."""
 x = x.unsqueeze(1)
 return torch.cat([x ** i for i in range(1, POLY_DEGREE+1)], 1)

對于輸入的PyTorch搭建多項式回歸模型(三)個數據,我們將其擴展成上面矩陣所示的樣子。

然后定義出我們需要擬合的多項式,可以隨機抽取一個多項式來作為我們的目標多項式。當然,系數PyTorch搭建多項式回歸模型(三)和偏置PyTorch搭建多項式回歸模型(三)確定了,多項式也就確定了:

W_target = torch.randn(POLY_DEGREE, 1)
b_target = torch.randn(1)
 
def f(x):
 """Approximated function."""
 return x.mm(W_target) + b_target.item()

這里的權重已經定義好了,x.mm(W_target)表示做矩陣乘法,PyTorch搭建多項式回歸模型(三)就是每次輸入一個PyTorch搭建多項式回歸模型(三)得到一個PyTorch搭建多項式回歸模型(三)的真實函數。

在訓練的時候我們需要采樣一些點,可以隨機生成一批數據來得到訓練集。下面的函數可以讓我們每次取batch_size這么多個數據,然后將其轉化為矩陣形式,再把這個值通過函數之后的結果也返回作為真實的輸出值:

def get_batch(batch_size=32):
 """Builds a batch i.e. (x, f(x)) pair."""
 random = torch.randn(batch_size)
 x = make_features(random)
 y = f(x)
 return x, y

接下來我們需要定義模型,這里采用一種簡寫的方式定義模型,torch.nn.Linear()表示定義一個線性模型,這里定義了是輸入值和目標參數的行數一致(和POLY_DEGREE一致,本次實驗中為3),輸出值為1的模型。

# Define model
fc = torch.nn.Linear(W_target.size(0), 1)

下面開始訓練模型,訓練的過程讓其不斷優化,直到隨機取出的batch_size個點中計算出來的均方誤差小于0.001為止。

for batch_idx in count(1):
 # Get data
 batch_x, batch_y = get_batch()
 
 # Reset gradients
 fc.zero_grad()
 
 # Forward pass
 output = F.smooth_l1_loss(fc(batch_x), batch_y)
 loss = output.item()
 
 # Backward pass
 output.backward()
 
 # Apply gradients
 for param in fc.parameters():
 param.data.add_(-0.1 * param.grad.data)
 
 # Stop criterion
 if loss < 1e-3:
 break

這樣就已經訓練出了我們的多項式回歸模型,為了方便觀察,定義了如下打印函數來打印出我們擬合的多項式表達式:

def poly_desc(W, b):
 """Creates a string description of a polynomial."""
 result = 'y = '
 for i, w in enumerate(W):
 result += '{:+.2f} x^{} '.format(w, len(W) - i)
 result += '{:+.2f}'.format(b[0])
 return result
 
print('Loss: {:.6f} after {} batches'.format(loss, batch_idx))
print('==> Learned function:\t' + poly_desc(fc.weight.view(-1), fc.bias))
print('==> Actual function:\t' + poly_desc(W_target.view(-1), b_target))

程序運行結果如下圖所示:

PyTorch搭建多項式回歸模型(三)

可以看出,真實的多項式表達式和我們擬合的多項式十分接近。現實世界中很多問題都不是簡單的線性回歸,涉及到很多復雜的非線性模型。但是我們可以在其特征量上進行研究,改變或者增加其特征,從而將非線性問題轉化為線性問題來解決,這種處理問題的思路是我們從多項式回歸的算法中應該汲取到的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

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

AI

德令哈市| 景谷| 长泰县| 宁晋县| 安阳市| 公安县| 阜宁县| 白水县| 菏泽市| 榆中县| 吉木萨尔县| 博爱县| 五峰| 大余县| 剑阁县| 滦平县| 泗水县| 墨竹工卡县| 无锡市| 南丰县| 东明县| 铜鼓县| 南陵县| 凤城市| 沙河市| 台中县| 蒙自县| 双峰县| 新泰市| 瑞昌市| 北川| 东安县| 阿尔山市| 永靖县| 崇义县| 岚皋县| 肥西县| 织金县| 府谷县| 临漳县| 上蔡县|