李宏毅2017机器学习homework1-利用gradient descent拟合宝可梦CP值代码并利用adagrad进行优化
import matplotlib.pyplot as plt
import numpy as npx_data = [338., 333., 328., 207., 226., 25., 179., 60., 208., 606.] # 进化前CP数据(10组)
y_data = [640., 633., 619., 393., 428., 27., 193., 66., 226., 1591.] # 进化后CP数据(10组)
# y_data=b+w*x_data(假设模型)
x = np.arange(-200, -100, 1) # bias(b),从-200~-100,以步长1为间隔返回数组(100)
y = np.arange(-5, 5, 0.1) # weight(w),同上(100)
Z = np.zeros((len(x), len(y))) # 形状为len(x)*len(y)零数组(100*100),存放loss值的矩阵(x,y组成的数据对共100*100个)X, Y = np.meshgrid(x, y) # 生成坐标矩阵# 计算loss functon(遍历x,y,计算出每组数据的loss):当b=x[i],w=y[j]时,loss(f(w,b))=Σ(y_data[n]-b-w*x_data[n])**2
for i in range(len(x)):for j in range(len(y)):# 利用x,y中所有元素b = x[i]w = y[j]Z[j][i] = 0 # 初始化loss值,用于累加for n in range(len(x_data)):Z[j][i] = Z[j][i] + (y_data[n] - b - w * x_data[n]) ** 2 # 计算数据对b=x[i],w=y[j]时总的loss值(利用十组样本数据)Z[j][i] = Z[j][i] / len(x_data) # 求b=x[i],w=y[j]时的平均loss值
# y_data=b+w*x_data
b = -120 # 初始化w,b(随机的初始化,保证w,b在范围内即可)
w = -4
lr = 0.0000001 # learning rate(步长)
iteration = 100000 # 迭代数
# 存储b,w的历史值用于画图
b_history = [b]
w_history = [w]
# iterations
for i in range(iteration):b_grad = 0.0 # b_grad,w_grad用于累加,所以初始化为0(≠b,w)w_grad = 0.0for n in range(len(x_data)):b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0 # loss函数对b求偏导w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n] # loss函数对w求偏导# update parametersb = b - lr * b_grad # 向loss值减小方向移动,更新b,w值w = w - lr * w_grad# store parameters for plottingb_history.append(b) # 将更新后的b,w值加入列表,绘制等高线w_history.append(w)
# plot the figure
plt.contourf(x, y, Z, 50, alpha=0.5,cmap=plt.get_cmap('jet')) # 输入x,y,Z(loss值)生成等高线,按照高度分为50层(颜色代表Z大小),并设置属性--透明度0.5,颜色‘jet’一种过度色
plt.plot([-188.4], [2.67], '+', ms=12, markeredgewidth=2, color='orange') # markeredgewidth设置标记的宽度,‘+’表示标记的形状
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')
plt.xlim(-200, -100) # 限制x,y坐标范围
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16) # 设置坐标标签及其属性
plt.ylabel(r'$w$', fontsize=16)
plt.show()
print(w,b)#显示最终w,b的最佳值:2.6692640713379903 -188.3668387495323
代码主要是两部分:
1-loss矩阵(每对w,b的loss平均值)的求解
2-梯度下降法求解优化后的w,b(主要)
loss值以等高线的形式展示;
w,b为坐标轴
图中’+‘为w,b的最优解位置,黑色即为w,b的变化路线,背景色表示Z(loss)值的大小。
对learning rate进行优化—设置自适应learning rate(开始时lr大,随后逐渐变小),同时对不同的参数采取不同的lr,也即adagrad方法
公式为
其中g为第t次迭代的梯度,η为自己所设置的学习率。公式推导如下:
为RMS-均方根。下面是改进后的梯度下降:
# 版本2-优化模型使得b,w的learning rate不一样(adagrad方法)
import matplotlib.pyplot as plt
import numpy as npx_data = [338., 333., 328., 207., 226., 25., 179., 60., 208., 606.] # 进化前CP数据(10组)
y_data = [640., 633., 619., 393., 428., 27., 193., 66., 226., 1591.] # 进化后CP数据(10组)
# y_data=b+w*x_data(假设模型)
x = np.arange(-200, -100, 1) # bias(b),从-200~-100,以步长1为间隔返回数组(100)
y = np.arange(-5, 5, 0.1) # weight(w),同上(100)
Z = np.zeros((len(x), len(y))) # 形状为len(x)*len(y)零数组(100*100),存放loss值的矩阵(x,y组成的数据对共100*100个)X, Y = np.meshgrid(x, y) # 生成坐标矩阵# 计算loss functon(遍历x,y,计算出每组数据的loss):当b=x[i],w=y[j]时,loss(f(w,b))=Σ(y_data[n]-b-w*x_data[n])**2
for i in range(len(x)):for j in range(len(y)):# 利用x,y中所有元素b = x[i]w = y[j]Z[j][i] = 0 # 初始化loss值,用于累加for n in range(len(x_data)):Z[j][i] = Z[j][i] + (y_data[n] - b - w * x_data[n]) ** 2 # 计算数据对b=x[i],w=y[j]时总的loss值(利用十组样本数据)Z[j][i] = Z[j][i] / len(x_data) # 求b=x[i],w=y[j]时的平均loss值
# y_data=b+w*x_data
b = -120 # 初始化w,b(随机的初始化,保证w,b在范围内即可)
w = -4
lr = 1 # 改进四
iteration = 100000 # 迭代数
# 存储b,w的历史值用于画图
b_history = [b]
w_history = [w]
lr_b = 0
lr_w = 0 # 改进一,分别给予参数b,w不同的learning rate# iterations
for i in range(iteration):b_grad = 0.0 # b_grad,w_grad用于累加,所以初始化为0(≠b,w)w_grad = 0.0for n in range(len(x_data)):b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0 # loss函数对b求偏导w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n] # loss函数对w求偏导lr_b = lr_b + b_grad ** 2 # 改进二lr_w = lr_w + w_grad ** 2# update parametersb = b - lr / np.sqrt(lr_b) * b_grad # 改进三w = w - lr / np.sqrt(lr_w) * w_grad# store parameters for plottingb_history.append(b) # 将更新后的b,w值加入列表,绘制等高线w_history.append(w)
# plot the figure
plt.contourf(x, y, Z, 50, alpha=0.5,cmap=plt.get_cmap('jet')) # 输入x,y,Z(loss值)生成等高线,按照高度分为50层(颜色代表Z大小),并设置属性--透明度0.5,颜色‘jet’一种过度色
plt.plot([-188.4], [2.67], '+', ms=12, markeredgewidth=2, color='orange') # markeredgewidth设置标记的宽度,‘+’表示标记的形状
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')
plt.xlim(-200, -100) # 限制x,y坐标范围
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16) # 设置坐标标签及其属性
plt.ylabel(r'$w$', fontsize=16)
plt.show()
如有不妥请指正,谢谢!
李宏毅2017机器学习homework1-利用gradient descent拟合宝可梦CP值代码并利用adagrad进行优化相关推荐
- 李宏毅机器学习[1]-宝可梦CP值预测
最近在B站上学习李宏毅的机器学习的课程(2020版),他讲了一个预测宝可梦CP值的例子让我对机器学习有了一个大概的了解,或者说是让我明白了机器学习是要干嘛.下面是我对这个例子的认识和理解. 目标:预测 ...
- 李宏毅2017机器学习课程 回归
李宏毅2017机器学习课程 P3 回归 Regression 下文不区分w和ω( 文章目录 李宏毅2017机器学习课程 P3 回归 Regression 回归定义 举例:Pokemon精灵攻击力预测( ...
- 台大李宏毅2017机器学习国语课程(更新)
台大李宏毅2017机器学习国语课程(更新) 本博客转载自:新浪微博爱可可-爱生活 [台大李宏毅2017机器学习国语课程(更新)]"Machine Learning (Hung-yi Lee, ...
- 李宏毅机器学习笔记六——Gradient Descent
视频来源: 李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av10590361/?p=6 使用GD的注意 ...
- 宝可梦 图片识别python_初探利用Python进行图文识别(OCR)
话说什么是OCR????? 简介 OCR技术是光学字符识别的缩写(Optical Character Recognition),是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转 ...
- 机器学习基础--梯度下降(Gradient Descent)
Gradient Descent Review 前面预测宝可梦cp值的例子里,已经初步介绍了Gradient Descent的用法: In step 3, we have to solve the ...
- [机器学习] ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)
本文转自:https://blog.csdn.net/walilk/article/details/50978864 引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记, ...
- 台大李宏毅Machine Learning 2017Fall学习笔记 (4)Gradient Descent
台大李宏毅Machine Learning 2017Fall学习笔记 (4)Gradient Descent 这节课首先回顾了利用梯度下降法优化目标函数的基本步骤,然后对梯度下降法的应用技巧和其背后的 ...
- 机器学习数学知识补习——梯度下降(Gradient Descent)
导数 导数与微分: 图中的Δy.dy等符号的意义及关系如下: Δx:x的变化量: dx:x的变化量 Δ x Δx Δx趋于0时,则记作微元 d x dx dx: Δy: Δ y = f ( x 0 + ...
- 独家思维导图!让你秒懂李宏毅2020机器学习(一)—— Regression回归
独家思维导图!让你秒懂李宏毅2020机器学习(一)-- Regression回归 前言:博主为一名大二本科生,最近决心开始看李宏毅的深度学习系列课程,每学一个阶段决定写篇博客来归纳记录一下所学的东西, ...
最新文章
- 苹果笔记本适合学python吗_千万别花冤枉钱!大学生买本得这么选!
- Eclipse Gradle 构建多模块项目
- SAP PP常用表(重要)
- 九宫怎么排列和使用_什么是九宫飞星,九宫飞星在生活中的应用
- 三次样条曲线拟合及Matlab/Python实现
- idou老师教你学Istio 07: 如何用istio实现请求超时管理
- linux 内核高端内存意义,Linux内核高端内存管理
- 解决客户一例:使用域超级管理员打开Exchange 2010发现没有权限
- 别踩白块游戏java项目总结_学习小游戏别踩白块总结
- 天津科技大学计算机二级报名,2018年9月天津计算机二级报名6月20-25日
- The Security Database on the Server Does Not Have a Computer Account
- 802.11ac知识整合
- 谷歌浏览器导出导入插件
- 正版软件 |Windows 10 家庭版操作系统软件 终身授权
- solidworks装配体改为柔性_Y型钣金通风管道用SolidWorks怎么建模?溪风实战讲解
- 澎湃新闻网站全站新闻爬虫及各大新闻平台聚合爬虫发布
- python中导入numpy库_python中的Numpy库
- 比较日期大小的js代码分享
- com/fasterxml/classmate/TypeResolver
- 浪漫唯美婚礼调色LR预设
热门文章
- (day 42 - 字符翻转 ) 剑指 Offer 58 - II. 左旋转字符串
- python selenium click 动态加载_python selenium:不要等到click()命令之后加载页面
- table里面用三目_三个方法快速找到SAP后台Table
- 谷粒商城:SPU管理规格显示404
- Java进阶:SSM(Spring、Spring MVC、MyBatis)整合
- 实战React:ToDoList
- C#:获取访问端口号
- 实战Python:利用python在pycharm开发终端简易计算器
- linux设置开机自启动的方式总结
- 论文笔记_S2D.43_2018-CVPR_单张RGB-D图像的深度补全