Python利用AutoGrad实现自动计算函数斜率和梯度
作者:Ckend 发布时间:2023-09-27 22:47:59
AutoGrad 是一个老少皆宜的 Python 梯度计算模块。
对于初高中生而言,它可以用来轻易计算一条曲线在任意一个点上的斜率。
对于大学生、机器学习爱好者而言,你只需要传递给它Numpy这样的标准数据库下编写的损失函数,它就可以自动计算损失函数的导数(梯度)。
我们将从普通斜率计算开始,介绍到如何只使用它来实现一个逻辑回归模型。
1.准备
开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。
(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda,它内置了Python和pip.
(可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点
请选择以下任一种方式输入命令安装依赖:
1. Windows 环境 打开 Cmd (开始-运行-CMD)。
2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.
pip?install?autograd
2.计算斜率
对于初高中生同学而言,它可以用来轻松计算斜率,比如我编写一个斜率为0.5的直线函数:
# 公众号 Python实用宝典
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))
运行代码,传入任意X值,你就能得到在该X值下的斜率:
(base) G:\push\20220724>python 1.py
0.5
由于这是一条直线,因此无论你传什么值,都只会得到0.5的结果。
那么让我们再试试一个tanh函数:
# 公众号 Python实用宝典
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))
此时你会获得 1.0 这个 x 在tanh上的曲线的斜率:
(base) G:\push\20220724>python 1.py
0.419974341614026
我们还可以绘制出tanh的斜率的变化的曲线:
# 公众号 Python实用宝典
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()
图中蓝色的线是tanh,橙色的线是tanh的斜率,你可以非常清晰明了地看到tanh的斜率的变化。非常便于学习和理解斜率概念。
3.实现一个逻辑回归模型
有了Autograd,我们甚至不需要借用scikit-learn就能实现一个回归模型:
逻辑回归的底层分类就是基于一个sigmoid函数:
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))
从下面的损失函数可以看到,预测结果的好坏取决于weights的好坏,因此我们的问题转化为怎么优化这个 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))
知道了优化目标后,又有Autograd这个工具,我们的问题便迎刃而解了,我们只需要让weights往损失函数不断下降的方向移动即可:
# 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))
运行结果如下:
(base) G:\push\20220724>python regress.py
Initial loss: 2.772588722239781
Trained loss: 1.067270675787016
由此可见损失函数以及下降方式的重要性,损失函数不正确,你可能无法优化模型。损失下降幅度太单一或者太快,你可能会错过损失的最低点。
总而言之,AutoGrad是一个你用来优化模型的一个好工具,它可以给你提供更加直观的损失走势,进而让你有更多优化想象力。
有兴趣的朋友还可以看官方的更多示例代码:https://github.com/HIPS/autograd/blob/master/examples/
来源:https://mp.weixin.qq.com/s/rH2_onXJ3Xvf3eFlIQbvdw


猜你喜欢
- 本文介绍了使用Python来扫描指定目录下的文件,或者匹配指定后缀和前缀的函数。步骤如下:如果要扫描指定目录下的文件,包括子目录,需要调用s
- Django是个好工具,使用的很广泛。 在应用比较小的时候,会觉得它很快,但是随着应用复杂和壮大,就显得没那么高效了。当你了解所用的Web框
- 概要不要以为 Python 有自动垃圾回收就不会内存泄漏,本着它有“垃圾回收”我有“垃圾代码”的精神,现在总结一下三种常见的内存泄漏场景。无
- 一、思路往MySQL中插入1000000条数据只花了6秒钟!关键点:1.使用PreparedStatement对象2.rewriteBatc
- 比如要访问b站在a站设置一个cookies,则可以这样做: 1.在b.com下建立一个文件cookies.htm 内容为: 代码如下:内容摘
- 容器与可迭代对象在正式开始前先补充一些基本概念在 Python 中存在容器 与 可迭代对象容器:用来存储多个元素的数据结构,例如 列表,元组
- 首先,在数据库中创建一个表,用于存放图片:CREATE TABLE Images(Id INT PRIMARY KEY AUTO_INCRE
- 一、什么是嵌入类型先看如下代码:type user struct { name string &nb
- 一、正则与LIKE的区别 Mysql的正则表达式仅仅使SQL语言的一个子集,可以匹配基本的字符、字符串。例如:select * f
- 在所有的比例中黄金分割是最能引起人的美感的,0.618被公认为最具有审美意义的比例数字。黄金分割之所以那么普遍的流行,我猜一定跟理想女人体的
- 本文实例介绍了如何使用ASP代码来读写注册表,呵呵厉害吧! 一个例子: <%Dim ReadComputerNam
- 本文实例讲述了JS+HTML5 canvas绘制验证码。分享给大家供大家参考,具体如下:css样式:<style>body{ &
- 1、页签的表达。页签表达很清晰,当前页签突出,且层级包涵关系明确;看下图,一目了然的感觉,不用疑惑我在那部分里。不信?拿当当的对比一下,你感
- 前言python中有两种循环,while和for,两种循环的区别是,while循环之前,先判断一次,如果满足条件的话,再循环,for循环的时
- 本文也是开发项目中的一个小经验Tip,虽然很简单,但对很多朋友也有小帮助。我们实际工程中,可能遇到开发环境、预上线环境、线上环境等环境场景,
- 上传图片: if (!empty($_FILES["img"]["name"])) { //提取文件
- OS ( Operating System 操作系统 ) 操作系统模块;它是属于python的标准库,也就是Python自带的库;它常用于处
- range()函数配合循环一块使用很方便,今天来整理一下这个函数的主要用法,以及几个小例子首先来看一下函数原型,非常简单: range(st
- 1、配置环境支持python2和python3On Linux, Solaris, or FreeBSD, add the /usr/loc
- 前言我们这里主要是利用requests模块和bs4模块进行简单的爬虫的讲解,让大家可以对爬虫有了初步的认识,我们通过爬几个简单网站,让大家循