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. 李宏毅机器学习[1]-宝可梦CP值预测

    最近在B站上学习李宏毅的机器学习的课程(2020版),他讲了一个预测宝可梦CP值的例子让我对机器学习有了一个大概的了解,或者说是让我明白了机器学习是要干嘛.下面是我对这个例子的认识和理解. 目标:预测 ...

  2. 李宏毅2017机器学习课程 回归

    李宏毅2017机器学习课程 P3 回归 Regression 下文不区分w和ω( 文章目录 李宏毅2017机器学习课程 P3 回归 Regression 回归定义 举例:Pokemon精灵攻击力预测( ...

  3. 台大李宏毅2017机器学习国语课程(更新)

    台大李宏毅2017机器学习国语课程(更新) 本博客转载自:新浪微博爱可可-爱生活 [台大李宏毅2017机器学习国语课程(更新)]"Machine Learning (Hung-yi Lee, ...

  4. 李宏毅机器学习笔记六——Gradient Descent

    视频来源: 李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av10590361/?p=6 使用GD的注意 ...

  5. 宝可梦 图片识别python_初探利用Python进行图文识别(OCR)

    话说什么是OCR????? 简介 OCR技术是光学字符识别的缩写(Optical Character Recognition),是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转 ...

  6. 机器学习基础--梯度下降(Gradient Descent)

    Gradient Descent Review 前面预测宝可梦cp值的例子里,已经初步介绍了Gradient Descent的用法: In step 3,​ we have to solve the ...

  7. [机器学习] ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)

    本文转自:https://blog.csdn.net/walilk/article/details/50978864 引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记, ...

  8. 台大李宏毅Machine Learning 2017Fall学习笔记 (4)Gradient Descent

    台大李宏毅Machine Learning 2017Fall学习笔记 (4)Gradient Descent 这节课首先回顾了利用梯度下降法优化目标函数的基本步骤,然后对梯度下降法的应用技巧和其背后的 ...

  9. 机器学习数学知识补习——梯度下降(Gradient Descent)

    导数 导数与微分: 图中的Δy.dy等符号的意义及关系如下: Δx:x的变化量: dx:x的变化量 Δ x Δx Δx趋于0时,则记作微元 d x dx dx: Δy: Δ y = f ( x 0 + ...

  10. 独家思维导图!让你秒懂李宏毅2020机器学习(一)—— Regression回归

    独家思维导图!让你秒懂李宏毅2020机器学习(一)-- Regression回归 前言:博主为一名大二本科生,最近决心开始看李宏毅的深度学习系列课程,每学一个阶段决定写篇博客来归纳记录一下所学的东西, ...

最新文章

  1. 苹果笔记本适合学python吗_千万别花冤枉钱!大学生买本得这么选!
  2. Eclipse Gradle 构建多模块项目
  3. SAP PP常用表(重要)
  4. 九宫怎么排列和使用_什么是九宫飞星,九宫飞星在生活中的应用
  5. 三次样条曲线拟合及Matlab/Python实现
  6. idou老师教你学Istio 07: 如何用istio实现请求超时管理
  7. linux 内核高端内存意义,Linux内核高端内存管理
  8. 解决客户一例:使用域超级管理员打开Exchange 2010发现没有权限
  9. 别踩白块游戏java项目总结_学习小游戏别踩白块总结
  10. 天津科技大学计算机二级报名,2018年9月天津计算机二级报名6月20-25日
  11. The Security Database on the Server Does Not Have a Computer Account
  12. 802.11ac知识整合
  13. 谷歌浏览器导出导入插件
  14. 正版软件 |Windows 10 家庭版操作系统软件 终身授权
  15. solidworks装配体改为柔性_Y型钣金通风管道用SolidWorks怎么建模?溪风实战讲解
  16. 澎湃新闻网站全站新闻爬虫及各大新闻平台聚合爬虫发布
  17. python中导入numpy库_python中的Numpy库
  18. 比较日期大小的js代码分享
  19. com/fasterxml/classmate/TypeResolver
  20. 浪漫唯美婚礼调色LR预设

热门文章

  1. (day 42 - 字符翻转 ) 剑指 Offer 58 - II. 左旋转字符串
  2. python selenium click 动态加载_python selenium:不要等到click()命令之后加载页面
  3. table里面用三目_三个方法快速找到SAP后台Table
  4. 谷粒商城:SPU管理规格显示404
  5. Java进阶:SSM(Spring、Spring MVC、MyBatis)整合
  6. 实战React:ToDoList
  7. C#:获取访问端口号
  8. 实战Python:利用python在pycharm开发终端简易计算器
  9. linux设置开机自启动的方式总结
  10. 论文笔记_S2D.43_2018-CVPR_单张RGB-D图像的深度补全