Python利用AutoGrad實(shí)現(xiàn)自動(dòng)計(jì)算函數(shù)斜率和梯度
AutoGrad 是一個(gè)老少皆宜的 Python 梯度計(jì)算模塊。
對于初高中生而言,它可以用來輕易計(jì)算一條曲線在任意一個(gè)點(diǎn)上的斜率。
對于大學(xué)生、機(jī)器學(xué)習(xí)愛好者而言,你只需要傳遞給它Numpy這樣的標(biāo)準(zhǔn)數(shù)據(jù)庫下編寫的損失函數(shù),它就可以自動(dòng)計(jì)算損失函數(shù)的導(dǎo)數(shù)(梯度)。
我們將從普通斜率計(jì)算開始,介紹到如何只使用它來實(shí)現(xiàn)一個(gè)邏輯回歸模型。
1.準(zhǔn)備
開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。
(可選1) 如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda,它內(nèi)置了Python和pip.
(可選2) 此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點(diǎn)
請選擇以下任一種方式輸入命令安裝依賴:
1. Windows 環(huán)境 打開 Cmd (開始-運(yùn)行-CMD)。
2. MacOS 環(huán)境 打開 Terminal (command+空格輸入Terminal)。
3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip?install?autograd
2.計(jì)算斜率
對于初高中生同學(xué)而言,它可以用來輕松計(jì)算斜率,比如我編寫一個(gè)斜率為0.5的直線函數(shù):
# 公眾號 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:\push\20220724>python 1.py
0.5
由于這是一條直線,因此無論你傳什么值,都只會得到0.5的結(jié)果。
那么讓我們再試試一個(gè)tanh函數(shù):
# 公眾號 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í)你會獲得 1.0 這個(gè) x 在tanh上的曲線的斜率:
(base) G:\push\20220724>python 1.py
0.419974341614026
我們還可以繪制出tanh的斜率的變化的曲線:
# 公眾號 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è)回歸模型:
邏輯回歸的底層分類就是基于一個(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ù)測結(jié)果的好壞取決于weights的好壞,因此我們的問題轉(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è)工具,我們的問題便迎刃而解了,我們只需要讓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:\push\20220724>python regress.py
Initial loss: 2.772588722239781
Trained loss: 1.067270675787016
由此可見損失函數(shù)以及下降方式的重要性,損失函數(shù)不正確,你可能無法優(yōu)化模型。損失下降幅度太單一或者太快,你可能會錯(cuò)過損失的最低點(diǎn)。
總而言之,AutoGrad是一個(gè)你用來優(yōu)化模型的一個(gè)好工具,它可以給你提供更加直觀的損失走勢,進(jìn)而讓你有更多優(yōu)化想象力。
有興趣的朋友還可以看官方的更多示例代碼:https://github.com/HIPS/autograd/blob/master/examples/
到此這篇關(guān)于Python利用AutoGrad實(shí)現(xiàn)自動(dòng)計(jì)算函數(shù)斜率和梯度的文章就介紹到這了,更多相關(guān)Python AutoGrad計(jì)算函數(shù)斜率 梯度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python定時(shí)檢測無響應(yīng)進(jìn)程并重啟的實(shí)例代碼
這篇文章主要介紹了python定時(shí)檢測無響應(yīng)進(jìn)程并重啟的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04Python+Pytorch實(shí)戰(zhàn)之彩色圖片識別
這篇文章主要為大家詳細(xì)介紹了如何利用Python+Pytorch實(shí)現(xiàn)彩色圖片識別功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-09-09python正則匹配查詢港澳通行證辦理進(jìn)度示例分享
分享原創(chuàng)的一段查詢港澳通行證辦理進(jìn)度查詢的python 3.3代碼。利用socket請求相關(guān)網(wǎng)站,獲得結(jié)果后利用正則找出辦理進(jìn)度2013-12-12python 信息同時(shí)輸出到控制臺與文件的實(shí)例講解
今天小編就為大家分享一篇python 信息同時(shí)輸出到控制臺與文件的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05python中使用iterrows()對dataframe進(jìn)行遍歷的實(shí)例
今天小編就為大家分享一篇python中使用iterrows()對dataframe進(jìn)行遍歷的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06Python中排序函數(shù)sorted()函數(shù)的使用實(shí)例
sorted()作為Python內(nèi)置函數(shù)之一,其功能是對序列(列表、元組、字典、集合、還包括字符串)進(jìn)行排序,下面這篇文章主要給大家介紹了關(guān)于Python中排序函數(shù)sorted()函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-11-11如何用VScode配置Python開發(fā)環(huán)境
這篇文章主要介紹了如何用VScode配置Python開發(fā)環(huán)境,vscode有很多優(yōu)點(diǎn),用VScode來編寫Python,也是相當(dāng)?shù)暮糜玫?需要的朋友可以參考下2023-03-03python3用urllib抓取貼吧郵箱和QQ實(shí)例
在本篇文章里小編給大家整理了關(guān)于python3中運(yùn)用urllib抓取貼吧的郵箱以及QQ的實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-03-03