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

pytorch如何實(shí)現(xiàn)邏輯回歸

 更新時(shí)間:2024年02月20日 16:11:59   作者:聽風(fēng)吹等浪起  
這篇文章主要介紹了pytorch如何實(shí)現(xiàn)邏輯回歸問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1. 導(dǎo)入庫(kù)

機(jī)器學(xué)習(xí)的任務(wù)分為兩大類:分類和回歸

分類是對(duì)一堆目標(biāo)進(jìn)行識(shí)別歸類,例如貓狗分類、手寫數(shù)字分類等等

回歸是對(duì)某樣事物接下來行為的預(yù)測(cè),例如預(yù)測(cè)天氣等等

這次我們要完成的任務(wù)是邏輯回歸,雖然名字叫做回歸,其實(shí)是個(gè)二元分類的任務(wù)

首先看看我們需要的庫(kù)文件

  • torch.nn  是專門為神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)的接口
  • matplotlib 用來繪制圖像,幫助可視化任務(wù)
  • torch 定義張量,數(shù)據(jù)的傳輸利用張量來實(shí)現(xiàn)
  • optim 優(yōu)化器的包,例如SGD等
  • numpy 數(shù)據(jù)處理的包

2. 定義數(shù)據(jù)集

簡(jiǎn)單說明一下任務(wù),想在一個(gè)正方形的區(qū)域內(nèi)生成若干點(diǎn),然后手工設(shè)計(jì)label,最后通過神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,畫出決策邊界

假設(shè):正方形的邊長(zhǎng)是2,左下角的坐標(biāo)為(0,0),右上角的坐標(biāo)為(2,2)

然后我們手工定義分界線 y = x ,在分界線的上方定義為藍(lán)色,下方定義為紅色

2.1 生成數(shù)據(jù)

首先生成數(shù)據(jù)的代碼為

首先通過rand(0-1的均勻分布)生成200個(gè)點(diǎn),并將他們擴(kuò)大2倍,x1代表橫坐標(biāo),x2代表縱坐標(biāo)

然后定義一下分類,這里簡(jiǎn)單介紹一下zip函數(shù)。

zip會(huì)將這里的a,b對(duì)應(yīng)打包成一對(duì),這樣i對(duì)應(yīng)的就是(1,‘a’),i[0] 對(duì)應(yīng)的就是1 2 3

 

再回到我們的代碼,因?yàn)槲覀円獙?shí)現(xiàn)的是二元分類,所以我們定義兩個(gè)不同的類型,用pos,neg存起來。

然后我們知道i[1] 代表的是 x2 ,i[0] 代表的是x1 , 所以 x2 - x1 < 0 也就是也就是在直線y=x的下面為pos類型。

否則,為neg類型

最后,我們需要將pos,neg類型的繪制出來。因?yàn)閜os里面其實(shí)是類似于(1,1)這樣的坐標(biāo),因?yàn)閜os.append(i) 里面的 i 其實(shí)是(x1,x2) 的坐標(biāo)形式, 所以我們將pos 里面的第一個(gè)元素x1定義為賦值給橫坐標(biāo),第二個(gè)元素x2賦值給縱坐標(biāo)

然后通過scatter 繪制離散的點(diǎn)就可以,將pos 繪制成 red 顏色,neg 繪制成 blue 顏色,如圖

 

2.2 設(shè)置label

我們進(jìn)行的其實(shí)是有監(jiān)督學(xué)習(xí),所以需要label

這里需要注意的是,不同于回歸任務(wù),x1不是輸入,x2也不是輸出。應(yīng)該x1,x2都是輸入的元素,也就是特征feature。所以我們應(yīng)該將紅色的點(diǎn)集設(shè)置一個(gè)標(biāo)簽,例如 1 ,藍(lán)色的點(diǎn)集設(shè)置一個(gè)標(biāo)簽,例如 0.

實(shí)現(xiàn)代碼如下

很容易理解,訓(xùn)練集x_data 應(yīng)該是所有樣本,也就是pos和neg的所以元素。

而之前介紹了x1,x2都是輸入的特征,那么x_data的shape 應(yīng)該是 [200,2] 的。

而y_data 只有1(pos 紅色)類別,或者 0(neg 藍(lán)色)類型,所以y_data 的shape 應(yīng)該是 [200,1] 的。y_data view的原因是變成矩陣的形式而不是向量的形式

這里的意思是,假如坐標(biāo)是(1.5,0.5)那么應(yīng)該落在紅色區(qū)域,那么這個(gè)點(diǎn)的標(biāo)簽就是1

3. 搭建網(wǎng)絡(luò)+優(yōu)化器

網(wǎng)絡(luò)的類型很簡(jiǎn)單,不再贅述。至于為什么要繼承nn.Module或者super那步是干啥的不用管,基本上都是這樣寫的,記住就行。

需要注意的是我們輸入的特征是(n * 2) ,所以Linear 應(yīng)該是(2,1)

二元分類最后的輸出一般選用sigmoid函數(shù)

這里的損失函數(shù)我們選擇BCE,二元交叉熵?fù)p失函數(shù)。

算法為隨機(jī)梯度下降

4. 訓(xùn)練

訓(xùn)練的過程也比較簡(jiǎn)單,就是將模型的預(yù)測(cè)輸出值和真實(shí)的label作比較。

然后將梯度歸零,在反向傳播并且更新梯度。

5. 繪制決策邊界

這里模型訓(xùn)練完成后,將w0,w1 ,b取出來,然后繪制出直線

這里要繪制的是w0 * x1+ w1 * x2 + b = 0 ,因?yàn)樽铋_始介紹了x1代表橫坐標(biāo)x,x2代表縱坐標(biāo)y。

通過變形可知y = (- w0 * x1 - b ) / w1,結(jié)果如圖

程序輸出的損失為

最后,w0 = 4.1911 , w1 = -4.0290 ,b = 0.0209 ,近似等于y = x,和我們剛開始定義的分界線類似

6. 代碼

import torch.nn as nn
import matplotlib.pyplot as plt
import torch
from torch import optim
import numpy as np
 
torch.manual_seed(1)    # 保證程序隨機(jī)生成數(shù)一樣
 
x1 = torch.rand(200) * 2
x2 = torch.rand(200) * 2
data = zip(x1,x2)
pos = []                # 定義類型 1
neg = []                # 定義類型 2
def classification(data):
    for i in data:
        if(i[1] - i[0] < 0):
            pos.append(i)
        else:
            neg.append(i)
classification(data)
pos_x = [i[0] for i in pos]
pos_y = [i[1] for i in pos]
neg_x = [i[0] for i in neg]
neg_y = [i[1] for i in neg]
plt.scatter(pos_x,pos_y,c='r')
plt.scatter(neg_x,neg_y,c='b')
plt.show()
 
x_data = [[i[0],i[1]] for i in pos]
x_data.extend([[i[0],i[1]] for i in neg])
x_data = torch.Tensor(x_data)     # 輸入數(shù)據(jù) feature
 
y_data = [1 for i in range(len(pos))]
y_data.extend([0 for i in range(len(neg))])
y_data = torch.Tensor(y_data).view(-1,1)    # 對(duì)應(yīng)的標(biāo)簽
 
 
class LogisticRegressionModel(nn.Module):   # 定義網(wǎng)絡(luò)
    def __init__(self):
        super(LogisticRegressionModel,self).__init__()
        self.linear = nn.Linear(2,1)
        self.sigmoid = nn.Sigmoid()
    def forward(self,x):
        x = self.linear(x)
        x = self.sigmoid(x)
        return x
 
model = LogisticRegressionModel()
criterion = nn.BCELoss()    
optimizer = optim.SGD(model.parameters(),lr =0.01)
 
for epoch in range(10000):
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)     # 計(jì)算損失值
 
    if epoch % 1000 == 0:
        print(epoch,loss.item())     # 打印損失值
 
    optimizer.zero_grad()         # 梯度清零
    loss.backward()                 # 反向傳播
    optimizer.step()                # 梯度更新
 
w = model.linear.weight[0]      # 取出訓(xùn)練完成的結(jié)果
w0 = w[0]
w1 = w[1]
b = model.linear.bias.item()
 
with torch.no_grad():      # 繪制決策邊界,這里不需要計(jì)算梯度
    x= torch.arange(0,3).view(-1,1)
    y = (- w0 * x - b) / w1
    plt.plot(x.numpy(),y.numpy())
 
plt.scatter(pos_x,pos_y,c='r')          
plt.scatter(neg_x,neg_y,c='b')
plt.xlim(0,2)
plt.ylim(0,2)
plt.show()

程序結(jié)果

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • PyCharm License Activation激活碼失效問題的解決方法(圖文詳解)

    PyCharm License Activation激活碼失效問題的解決方法(圖文詳解)

    這篇文章主要介紹了PyCharm License Activation激活碼失效問題的解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • python實(shí)現(xiàn)的生成word文檔功能示例

    python實(shí)現(xiàn)的生成word文檔功能示例

    這篇文章主要介紹了python實(shí)現(xiàn)的生成word文檔功能,涉及Python數(shù)據(jù)查詢、遍歷及word文檔生成相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • python打開網(wǎng)頁和暫停實(shí)例

    python打開網(wǎng)頁和暫停實(shí)例

    這篇文章主要介紹了python打開網(wǎng)頁和暫停實(shí)例,涉及webbrowser模塊與os模塊的使用,是非常具有實(shí)用價(jià)值的一個(gè)技巧,需要的朋友可以參考下
    2014-09-09
  • Python生成指定大小的文件兩種解決方案

    Python生成指定大小的文件兩種解決方案

    這篇文章主要介紹了Python生成指定大小的文件,這里提供兩種解決方案幫助python完成我們生成任意大小的文件,需要的朋友可以參考下
    2023-06-06
  • 基于python的前后端分離的模擬實(shí)現(xiàn)

    基于python的前后端分離的模擬實(shí)現(xiàn)

    前后端分離核心是UI界面展示層(View)和數(shù)據(jù)處理層(Model)通過控制層(Controller)進(jìn)行解耦合,在MVC設(shè)計(jì)模式中,前端主要負(fù)責(zé)數(shù)據(jù)展示和用戶交互(View),后端處理業(yè)務(wù)邏輯和數(shù)據(jù)存儲(chǔ)(Model),通過API接口進(jìn)行通信,提高了開發(fā)效率,便于前后端分工合作,有利于代碼的維護(hù)和迭代
    2024-10-10
  • Python Numpy實(shí)現(xiàn)計(jì)算矩陣的均值和標(biāo)準(zhǔn)差詳解

    Python Numpy實(shí)現(xiàn)計(jì)算矩陣的均值和標(biāo)準(zhǔn)差詳解

    NumPy(Numerical Python)是Python的一種開源的數(shù)值計(jì)算擴(kuò)展。這種工具可用來存儲(chǔ)和處理大型矩陣,比Python自身的嵌套列表結(jié)構(gòu)要高效的多。本文主要介紹用NumPy實(shí)現(xiàn)計(jì)算矩陣的均值和標(biāo)準(zhǔn)差,感興趣的小伙伴可以了解一下
    2021-11-11
  • Python+matplotlib+numpy繪制精美的條形統(tǒng)計(jì)圖

    Python+matplotlib+numpy繪制精美的條形統(tǒng)計(jì)圖

    這篇文章主要介紹了Python+matplotlib+numpy繪制精美的條形統(tǒng)計(jì)圖,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Windows下創(chuàng)建定時(shí)任務(wù)執(zhí)行Python腳本的方法實(shí)現(xiàn)

    Windows下創(chuàng)建定時(shí)任務(wù)執(zhí)行Python腳本的方法實(shí)現(xiàn)

    Python定時(shí)任務(wù)執(zhí)行,本文主要介紹了Windows下創(chuàng)建定時(shí)任務(wù)執(zhí)行Python腳本的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • python連接讀寫操作redis的完整代碼實(shí)例

    python連接讀寫操作redis的完整代碼實(shí)例

    這篇文章主要介紹了python連接讀寫操作redis的完整代碼實(shí)例,包括redis連接與讀寫操作,redis-sentinel哨兵模式下Python操作redis,redis-cluster(集群)模式下Python操作redis,需要的朋友可以參考下
    2023-01-01
  • 詳解pandas繪制矩陣散點(diǎn)圖(scatter_matrix)的方法

    詳解pandas繪制矩陣散點(diǎn)圖(scatter_matrix)的方法

    這篇文章主要介紹了詳解pandas繪制矩陣散點(diǎn)圖(scatter_matrix)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評(píng)論

蕲春县| 静乐县| 鄂托克前旗| 航空| 连云港市| 乃东县| 宜都市| 宜都市| 慈溪市| 岗巴县| 博罗县| 新宾| 日土县| 永春县| 丰原市| 平原县| 沁水县| 鄂托克前旗| 株洲市| 礼泉县| 宝丰县| 商水县| 西充县| 东莞市| 莲花县| 桦川县| 河间市| 华阴市| 中西区| 化德县| 图木舒克市| 迁安市| 大足县| 武宁县| 轮台县| 南川市| 大化| 澄城县| 望奎县| 兴仁县| 许昌市|