0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python 梯度計(jì)算模塊如何實(shí)現(xiàn)一個(gè)邏輯回歸模型

科技綠洲 ? 來(lái)源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-10-21 11:01 ? 次閱讀

AutoGrad 是一個(gè)老少皆宜的 Python 梯度計(jì)算模塊。

對(duì)于初高中生而言,它可以用來(lái)輕易計(jì)算一條曲線在任意一個(gè)點(diǎn)上的斜率。

對(duì)于大學(xué)生、機(jī)器學(xué)習(xí)愛(ài)好者而言,你只需要傳遞給它Numpy這樣的標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)下編寫(xiě)的損失函數(shù),它就可以自動(dòng)計(jì)算損失函數(shù)的導(dǎo)數(shù)(梯度)。

我們將從普通斜率計(jì)算開(kāi)始,介紹到如何只使用它來(lái)實(shí)現(xiàn)一個(gè)邏輯回歸模型。

1.準(zhǔn)備

開(kāi)始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒(méi)有,可以訪問(wèn)這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。

**(可選1) **如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.

**(可選2) **此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點(diǎn):Python 編程的最好搭檔—VSCode 詳細(xì)指南。

請(qǐng)選擇以下任一種方式輸入命令安裝依賴(lài)

  1. Windows 環(huán)境 打開(kāi) Cmd (開(kāi)始-運(yùn)行-CMD)。
  2. MacOS 環(huán)境 打開(kāi) Terminal (command+空格輸入Terminal)。
  3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install autograd

2.計(jì)算斜率

對(duì)于初高中生同學(xué)而言,它可以用來(lái)輕松計(jì)算斜率,比如我編寫(xiě)一個(gè)斜率為0.5的直線函數(shù):

# 公眾號(hào) Python實(shí)用寶典
import autograd.numpy as np
from autograd import grad


def oneline(x):
    y = x/2
    return y

grad_oneline = grad(oneline)
print(grad_oneline(3.0))

運(yùn)行代碼,傳入任意X值,你就能得到在該X值下的斜率:

(base) G:push20220724 >python 1.py
0.5

由于這是一條直線,因此無(wú)論你傳什么值,都只會(huì)得到0.5的結(jié)果。

那么讓我們?cè)僭囋囈粋€(gè)tanh函數(shù):

# 公眾號(hào) Python實(shí)用寶典
import autograd.numpy as np
from autograd import grad

def tanh(x):
    y = np.exp(-2.0 * x)
    return (1.0 - y) / (1.0 + y)
grad_tanh = grad(tanh)
print(grad_tanh(1.0))

此時(shí)你會(huì)獲得 1.0 這個(gè) x 在tanh上的曲線的斜率:

(base) G:push20220724 >python 1.py
0.419974341614026

我們還可以繪制出tanh的斜率的變化的曲線:

# 公眾號(hào) Python實(shí)用寶典
import autograd.numpy as np
from autograd import grad


def tanh(x):
    y = np.exp(-2.0 * x)
    return (1.0 - y) / (1.0 + y)
grad_tanh = grad(tanh)
print(grad_tanh(1.0))

import matplotlib.pyplot as plt
from autograd import elementwise_grad as egrad
x = np.linspace(-7, 7, 200)
plt.plot(x, tanh(x), x, egrad(tanh)(x))
plt.show()

圖片

圖中藍(lán)色的線是tanh,橙色的線是tanh的斜率,你可以非常清晰明了地看到tanh的斜率的變化。非常便于學(xué)習(xí)和理解斜率概念。

3.實(shí)現(xiàn)一個(gè)邏輯回歸模型

有了Autograd,我們甚至不需要借用scikit-learn就能實(shí)現(xiàn)一個(gè)回歸模型:

邏輯回歸的底層分類(lèi)就是基于一個(gè)sigmoid函數(shù):

import autograd.numpy as np
from autograd import grad

# Build a toy dataset.
inputs = np.array([[0.52, 1.12, 0.77],
                   [0.88, -1.08, 0.15],
                   [0.52, 0.06, -1.30],
                   [0.74, -2.49, 1.39]])
targets = np.array([True, True, False, True])

def sigmoid(x):
    return 0.5 * (np.tanh(x / 2.) + 1)

def logistic_predictions(weights, inputs):
    # Outputs probability of a label being true according to logistic model.
    return sigmoid(np.dot(inputs, weights))

從下面的損失函數(shù)可以看到,預(yù)測(cè)結(jié)果的好壞取決于weights的好壞,因此我們的問(wèn)題轉(zhuǎn)化為怎么優(yōu)化這個(gè) weights 變量:

def training_loss(weights):
    # Training loss is the negative log-likelihood of the training labels.
    preds = logistic_predictions(weights, inputs)
    label_probabilities = preds * targets + (1 - preds) * (1 - targets)
    return -np.sum(np.log(label_probabilities))

知道了優(yōu)化目標(biāo)后,又有Autograd這個(gè)工具,我們的問(wèn)題便迎刃而解了,我們只需要讓weights往損失函數(shù)不斷下降的方向移動(dòng)即可:

# Define a function that returns gradients of training loss using Autograd.
training_gradient_fun = grad(training_loss)

# Optimize weights using gradient descent.
weights = np.array([0.0, 0.0, 0.0])
print("Initial loss:", training_loss(weights))
for i in range(100):
    weights -= training_gradient_fun(weights) * 0.01

print("Trained loss:", training_loss(weights))

運(yùn)行結(jié)果如下:

(base) G:push20220724 >python regress.py
Initial loss: 2.772588722239781
Trained loss: 1.067270675787016

由此可見(jiàn)損失函數(shù)以及下降方式的重要性,損失函數(shù)不正確,你可能無(wú)法優(yōu)化模型。損失下降幅度太單一或者太快,你可能會(huì)錯(cuò)過(guò)損失的最低點(diǎn)。

總而言之,AutoGrad是一個(gè)你用來(lái)優(yōu)化模型的一個(gè)好工具,它可以給你提供更加直觀的損失走勢(shì),進(jìn)而讓你有更多優(yōu)化想象力。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2713

    瀏覽量

    47485
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3800

    瀏覽量

    64402
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4331

    瀏覽量

    62633
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3244

    瀏覽量

    48849
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84695
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    分享個(gè)自己寫(xiě)的機(jī)器學(xué)習(xí)線性回歸梯度下降算法

    單變量線性回歸算法,利用Batch梯度梯度下降算法迭代計(jì)算得到誤差最小的代價(jià)函數(shù)theta0,theta1。調(diào)節(jié)學(xué)習(xí)率a可以觀察擬合得到的函數(shù)和代價(jià)函數(shù)誤差收斂情況。
    發(fā)表于 10-02 21:48

    回歸預(yù)測(cè)之入門(mén)

    式子吧,不然看些相關(guān)的論文可就看不懂了,這個(gè)系列主要將會(huì)著重于去機(jī)器學(xué)習(xí)的數(shù)學(xué)描述這個(gè)部分,將會(huì)覆蓋但不定局限于回歸、聚類(lèi)、分類(lèi)等算法。回歸
    發(fā)表于 10-15 10:19

    淺析邏輯回歸

    ML-邏輯回歸-公式推導(dǎo)- 多種實(shí)現(xiàn)
    發(fā)表于 04-25 15:35

    回歸算法之邏輯回歸的介紹

    回歸算法之邏輯回歸
    發(fā)表于 05-21 16:25

    回歸算法有哪些,常用回歸算法(3種)詳解

    隨機(jī)梯度下降來(lái)估計(jì)系數(shù)。損失函數(shù)通常被定義為交叉熵項(xiàng): 邏輯回歸用于分類(lèi)問(wèn)題,例如,對(duì)于給定的醫(yī)療數(shù)據(jù),可以使用邏輯回歸判斷
    發(fā)表于 07-28 14:36

    TensorFlow實(shí)現(xiàn)簡(jiǎn)單線性回歸

    節(jié)點(diǎn),可以看到它需要 7 個(gè)輸入并使用 GradientDescentOptimizer 計(jì)算梯度,對(duì)權(quán)重和偏置進(jìn)行更新:(點(diǎn)此查看高清大圖)總結(jié)本節(jié)進(jìn)行了簡(jiǎn)單的線性回歸,但是如何定義
    發(fā)表于 08-11 19:34

    TensorFlow實(shí)現(xiàn)多元線性回歸(超詳細(xì))

    在 TensorFlow 實(shí)現(xiàn)簡(jiǎn)單線性回歸的基礎(chǔ)上,可通過(guò)在權(quán)重和占位符的聲明中稍作修改來(lái)對(duì)相同的數(shù)據(jù)進(jìn)行多元線性回歸。在多元線性回歸的情況下,由于每個(gè)特征具有不同的值范圍,歸
    發(fā)表于 08-11 19:35

    TensorFlow邏輯回歸處理MNIST數(shù)據(jù)集

    。mnist.train.images 的每項(xiàng)都是個(gè)范圍介于 0 到 1 的像素強(qiáng)度: 在 TensorFlow 圖中為訓(xùn)練數(shù)據(jù)集的輸入 x 和標(biāo)簽 y 創(chuàng)建占位符: 創(chuàng)建學(xué)習(xí)變量、權(quán)重和偏置: 創(chuàng)建邏輯
    發(fā)表于 08-11 19:36

    TensorFlow邏輯回歸處理MNIST數(shù)據(jù)集

    。mnist.train.images 的每項(xiàng)都是個(gè)范圍介于 0 到 1 的像素強(qiáng)度: 在 TensorFlow 圖中為訓(xùn)練數(shù)據(jù)集的輸入 x 和標(biāo)簽 y 創(chuàng)建占位符: 創(chuàng)建學(xué)習(xí)變量、權(quán)重和偏置: 創(chuàng)建邏輯
    發(fā)表于 08-11 19:36

    使用KNN進(jìn)行分類(lèi)和回歸

    般情況下k-Nearest Neighbor (KNN)都是用來(lái)解決分類(lèi)的問(wèn)題,其實(shí)KNN是種可以應(yīng)用于數(shù)據(jù)分類(lèi)和預(yù)測(cè)的簡(jiǎn)單算法,本文中我們將它與簡(jiǎn)單的線性回歸進(jìn)行比較。KNN模型
    發(fā)表于 10-28 14:44

    文看懂常用的梯度下降算法

    的。梯度下降算法背后的原理:目標(biāo)函數(shù) 關(guān)于參數(shù) 的梯度將是目標(biāo)函數(shù)上升最快的方向。對(duì)于最小化優(yōu)化問(wèn)題,只需要將參數(shù)沿著梯度相反的方向前進(jìn)個(gè)
    發(fā)表于 12-04 18:17 ?1801次閱讀

    掌握l(shuí)ogistic regression模型,有必要先了解線性回歸模型梯度下降法

    先回想下線性回歸,線性回歸模型幫助我們用最簡(jiǎn)單的線性方程實(shí)現(xiàn)了對(duì)數(shù)據(jù)的擬合,然而,這只能完成回歸
    的頭像 發(fā)表于 06-04 11:31 ?7601次閱讀
    掌握l(shuí)ogistic regression<b class='flag-5'>模型</b>,有必要先了解線性<b class='flag-5'>回歸</b><b class='flag-5'>模型</b>和<b class='flag-5'>梯度</b>下降法

    數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法

    跟上講寫(xiě)線性模型樣,在實(shí)際動(dòng)手寫(xiě)之前我們需要理清楚思路。要寫(xiě)個(gè)完整的邏輯
    的頭像 發(fā)表于 10-16 16:12 ?2752次閱讀
    數(shù)學(xué)推導(dǎo)+純<b class='flag-5'>Python</b><b class='flag-5'>實(shí)現(xiàn)</b>機(jī)器學(xué)習(xí)算法

    詳談Python的數(shù)據(jù)模型和對(duì)象模型

    Python官方文檔說(shuō)法是“Python數(shù)據(jù)模型”,大多數(shù)Python書(shū)籍作者說(shuō)法是“Python對(duì)象
    的頭像 發(fā)表于 02-10 15:59 ?2556次閱讀
    詳談<b class='flag-5'>Python</b>的數(shù)據(jù)<b class='flag-5'>模型</b>和對(duì)象<b class='flag-5'>模型</b>

    Logistic回歸數(shù)學(xué)推導(dǎo)以及python實(shí)現(xiàn)

    Logistic回歸數(shù)學(xué)推導(dǎo)以及python實(shí)現(xiàn)
    發(fā)表于 02-25 14:48 ?7次下載