当前位置: 首页 > news >正文

梯度下降算法,gradient descent algorithm

定义:是一个优化算法,也成最速下降算法,主要的部的士通过迭代找到目标函数的最小值,或者收敛到最小值。
说人话就是求一个函数的极值点,极大值或者极小值

算法过程中有几个超参数:
学习率n,又称每次走的步长, n会影响获得最优解的速度,取值不合适的时候可能达不到最优解
阈值 threshold, 当两步之间的差值

求解步骤

  1. 给定初始点x,阈值和学习率
  2. 计算函数在该点的导数
  3. 根据梯度下降公式得到下一个x点:x=x-学习率*导数
  4. 计算更新前后两点函数值的差值
  5. 如果差值小于阈值则找到极值点,否则重复2-5步

例如用梯度下降算法计算下列函数的极值点 y = ( x − 2.5 ) 2 − 1 y = (x-2.5)^2 -1 y=(x2.5)21
构造数据

import numpy as np
import matplotlib.pyplot as  plt
plot_x = np.linspace(-1, 6, 141)
plot_y = (plot_x - 2.5) ** 2 - 1
plt.plot(plot_x, plot_y)

def J(theta):  #原始函数return ((theta - 2.5)**2 - 1)def dJ(theta): #导数return 2*(theta - 2.5)def gradient_descent(xs, x, eta, espilon):theta = xxs.append(x)while True:gradient = dJ(theta)last_theta = thetatheta = theta - eta * gradientxs.append(theta)if (abs(J(theta) - J(last_theta)) < espilon):breaketa = 0.0001 #每次前进的 x
xs = []
espilon = 1e-8
gradient_descent(xs, 1, eta, espilon)plt.plot(plot_x, J(plot_x))
plt.plot(np.array(xs), J(np.array(xs)), color="r", marker="+")
print(xs[-1])

2.495000939618705
请添加图片描述

起点我们也可以从另一端开始
例如5

eta = 0.0001 #每次前进的 x
xs = []
espilon = 1e-8
gradient_descent(xs, 5, eta, espilon)plt.plot(plot_x, J(plot_x))
plt.plot(np.array(xs), J(np.array(xs)), color="r", marker="+")
print(xs[-1])

请添加图片描述

计算的极值点 y = − ( x − 2.5 ) 2 − 1 y = -(x-2.5)^2 -1 y=(x2.5)21

def J(theta):  #原始函数return -((theta - 2.5)**2 - 1)def dJ(theta): #导数return -2*(theta - 2.5)def gradient_descent(xs, x, eta, espilon):theta = xxs.append(x)while True:gradient = dJ(theta)last_theta = thetatheta = theta + eta * gradientxs.append(theta)if (abs(J(theta) - J(last_theta)) < espilon):breaketa = 0.0001 #每次前进的 x
xs = []
espilon = 1e-8
gradient_descent(xs, 1, eta, espilon)plt.plot(plot_x, J(plot_x))
plt.plot(np.array(xs), J(np.array(xs)), color="r", marker="+")
print(xs[-1])

请添加图片描述

使用梯度下降算法计算最简单的线性模型

假设有两组数据

x = np.array([55, 71, 68, 87, 101, 87, 75, 78, 93, 73])
y = np.array([91, 101, 87, 109, 129, 98, 95, 101, 104, 93])

线性模型的损失函数如下:

f = ∑ n = 1 n ( y i − ( w 0 + w i x i ) ) 2 f = \sum_{n=1}^n (y_i - (w_0 + w_i x_i))^2 f=n=1n(yi(w0+wixi))2

其中 w0 和 w1 是我们要求的值,他们代表了线性方程中的两个系数

分别对w0 和 w1求偏导数

∂ f ∂ w 0 = − 2 ∑ n = 1 n ( y i − ( w 0 + w i x i ) ) \frac{\partial f}{\partial w_0} = -2\sum_{n=1}^n(y_i-(w_0+w_ix_i)) w0f=2n=1n(yi(w0+wixi))

∂ f ∂ w 1 = − 2 ∑ n = 1 n x i ( y i − ( w 0 + w i x i ) ) \frac{\partial f}{\partial w_1} = -2\sum_{n=1}^nx_i(y_i-(w_0+w_ix_i)) w1f=2n=1nxi(yi(w0+wixi))

注意区分w1 多了一个xi

参照公式 x=x-学习率*导数
得到

w0_gradient = -2 * sum((y - y_hat))
w1_gradient = -2 * sum(x * (y - y_hat))
def ols_gradient_descent(x, y, lr, num_iter):'''x 自变量y 因变量num_iter -- 迭代次数返回:w1 -- 线性方程系数w0 -- 线性方程的截距'''w1 = 0w0 = 0for i in range(num_iter):y_hat = (w1 * x) + w0w0_gradient = -2 * sum((y - y_hat))w1_gradient = -2 * sum(x * (y - y_hat))w1 -= lr * w1_gradientw0 -= lr * w0_gradientreturn w1, w0x = np.array([55, 71, 68, 87, 101, 87, 75, 78, 93, 73])
y = np.array([91, 101, 87, 109, 129, 98, 95, 101, 104, 93])lr = 0.00001 # 迭代步长
num_iter = 500 #迭代次数
w1, w0 = ols_gradient_descent(x, y, lr=0.00001, num_iter=500)print(w1, w0)
xs = np.array([50, 100])
ys = xs * w1 + w0plt.plot(xs, ys, color = "r")
plt.scatter(x, y)

w1 = 1.2633124475159723
w0 = 0.12807483308616532

请添加图片描述

http://www.lryc.cn/news/407979.html

相关文章:

  • Spring boot 2.0 升级到 3.3.1 的相关问题 (六)
  • C++模版基础知识与STL基本介绍
  • Android 防止重复点击
  • 使用阿里云云主机通过nginx搭建文件服务器
  • 微信Android一面凉经(2024)
  • VMware、Docker - 让虚拟机走主机代理,解决镜像封禁问题
  • 版本管理|为什么不推荐使用Git Rebase
  • Https post 请求时绕过证书验证方案
  • C# 数组常用遍历方式
  • 【JavaScript】详解Day.js:轻量级日期处理库的全面指南
  • AI算法与图像处理 | 吴恩达团队新作!多模态方向
  • 云服务器Ubuntu18.04进行Nginx配置
  • SQL labs-SQL注入(四,sqlmap对于post传参方式的注入)
  • R包:plot1cell单细胞可视化包
  • Tent混沌人工蜂群与粒子群混合算法遇到问题,具体问题及解决方案如文。
  • Python文献调研(一)环境搭建
  • URL重写
  • git配置环境变量
  • vue3编程-import.meta.glob实现动态路由(菜单)
  • 富唯智能转运机器人:高效、智能、未来的选择
  • 跨境电商独立站:Shopify/Wordpress/店匠选哪个?
  • 减轻幻觉新SOTA,7B模型自迭代训练效果超越GPT-4,上海AI lab发布
  • 53.最大子数组和,动态规划+贪心解法!!!
  • python+vue3+onlyoffice在线文档系统实战20240723笔记,项目界面设计和初步开发
  • 谷粒商城实战笔记-72-商品服务-API-属性分组-获取分类属性分组
  • Vue 自定义指令
  • 【python】python图书管理系统_普通用户+管理员菜单(源码+论文)【独一无二】
  • 智能路面裂缝检测:基于YOLO和深度学习的全流程实现
  • C++ unordered_map
  • PHP Switch 语句