最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年05月22日 08:36:19   作者:Liam Coder  
這篇文章主要為大家詳細(xì)介紹了PyTorch搭建多項(xiàng)式回歸模型,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

PyTorch基礎(chǔ)入門三:PyTorch搭建多項(xiàng)式回歸模型 

1)理論簡介

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

如果我們想要擬合方程:

對于輸入變量和輸出值,我們只需要增加其平方項(xiàng)、三次方項(xiàng)系數(shù)即可。所以,我們可以設(shè)置如下參數(shù)方程:

可以看到,上述方程與線性回歸方程并沒有本質(zhì)區(qū)別。所以我們可以采用線性回歸的方式來進(jìn)行多項(xiàng)式的擬合。下面請看代碼部分。

2)代碼實(shí)現(xiàn)

當(dāng)然最先要做的就是導(dǎo)包了,下面需要說明的只有一個(gè):itertools中的count,這個(gè)是用來記數(shù)用的,其可以記數(shù)到無窮,第一個(gè)參數(shù)是記數(shù)的起始值,第二個(gè)參數(shù)是步長。其內(nèi)部實(shí)現(xiàn)相當(dāng)于如下代碼:

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

下面是導(dǎo)包部分代碼,這里定義了一個(gè)常量POLY_DEGREE = 3用來指定多項(xiàng)式最高次數(shù)。

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

然后我們需要將數(shù)據(jù)處理成矩陣的形式:

在PyTorch里面使用torch.cat()函數(shù)來實(shí)現(xiàn)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)

對于輸入的個(gè)數(shù)據(jù),我們將其擴(kuò)展成上面矩陣所示的樣子。

然后定義出我們需要擬合的多項(xiàng)式,可以隨機(jī)抽取一個(gè)多項(xiàng)式來作為我們的目標(biāo)多項(xiàng)式。當(dāng)然,系數(shù)和偏置確定了,多項(xiàng)式也就確定了:

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()

這里的權(quán)重已經(jīng)定義好了,x.mm(W_target)表示做矩陣乘法,就是每次輸入一個(gè)得到一個(gè)的真實(shí)函數(shù)。

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

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()表示定義一個(gè)線性模型,這里定義了是輸入值和目標(biāo)參數(shù)的行數(shù)一致(和POLY_DEGREE一致,本次實(shí)驗(yàn)中為3),輸出值為1的模型。

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

下面開始訓(xùn)練模型,訓(xùn)練的過程讓其不斷優(yōu)化,直到隨機(jī)取出的batch_size個(gè)點(diǎn)中計(jì)算出來的均方誤差小于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

這樣就已經(jīng)訓(xùn)練出了我們的多項(xiàng)式回歸模型,為了方便觀察,定義了如下打印函數(shù)來打印出我們擬合的多項(xiàng)式表達(dá)式:

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))

程序運(yùn)行結(jié)果如下圖所示:

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python3的socket使用方法詳解

    Python3的socket使用方法詳解

    這篇文章主要介紹了Python3的socket使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python貪婪匹配以及多行匹配的實(shí)例講解

    python貪婪匹配以及多行匹配的實(shí)例講解

    下面小編就為大家分享一篇python貪婪匹配以及多行匹配的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python實(shí)現(xiàn)word2Vec model過程解析

    Python實(shí)現(xiàn)word2Vec model過程解析

    這篇文章主要介紹了Python實(shí)現(xiàn)word2Vec model過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼

    Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼

    這篇文章主要介紹了Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼,需要的朋友可以參考下
    2016-08-08
  • 利用python在大量數(shù)據(jù)文件下刪除某一行的例子

    利用python在大量數(shù)據(jù)文件下刪除某一行的例子

    今天小編就為大家分享一篇利用python在大量數(shù)據(jù)文件下刪除某一行的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Pandas如何對Categorical類型字段數(shù)據(jù)統(tǒng)計(jì)實(shí)戰(zhàn)案例

    Pandas如何對Categorical類型字段數(shù)據(jù)統(tǒng)計(jì)實(shí)戰(zhàn)案例

    這篇文章主要介紹了Pandas如何對Categorical類型字段數(shù)據(jù)統(tǒng)計(jì)實(shí)戰(zhàn)案例,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • pandas獲取對應(yīng)的行或者列方式

    pandas獲取對應(yīng)的行或者列方式

    這篇文章主要介紹了pandas獲取對應(yīng)的行或者列方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python實(shí)現(xiàn)DHCP請求方式

    Python實(shí)現(xiàn)DHCP請求方式

    這篇文章主要介紹了Python實(shí)現(xiàn)DHCP請求方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python @property及getter setter原理詳解

    Python @property及getter setter原理詳解

    這篇文章主要介紹了Python @property及getter setter原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python中Django 后臺自定義表單控件

    Python中Django 后臺自定義表單控件

    本篇文章主要介紹了Python中Django 后臺自定義表單控件,其實(shí) django 已經(jīng)為我們提供了一些可用的表單控件,比如:多選框、單選按鈕等,有興趣的開業(yè)了解一下。
    2017-03-03

最新評論

丁青县| 靖宇县| 博白县| 明溪县| 鹰潭市| 合肥市| 迁安市| 西畴县| 正阳县| 高密市| 迁西县| 确山县| 阜新| 德昌县| 会昌县| 辽中县| 平塘县| 双城市| 嘉祥县| 嘉定区| 大渡口区| 保康县| 宜章县| 阿克陶县| 永城市| 临武县| 佛学| 高碑店市| 修武县| 洛宁县| 南城县| 夏邑县| 常德市| 开封市| 西华县| 连州市| 海南省| 东山县| 广平县| 张家界市| 获嘉县|