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

机器学习-梯度下降实验

什么是梯度

梯度:梯度的本意是一个向量,由函数对每个参数的偏导组成,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快,变化率最大。
在这里插入图片描述

梯度下降算法原理

算法思想:梯度下降是一种非常通用的优化算法,能够为大范围的问题找到最优解。梯度下降的中心思想就是迭代地调整参数从而使损失函数最小化。假设你迷失在山上的迷雾中,你能感觉到的只有你脚下路面的坡度。快速到达山脚的一个策略就是沿着最陡的方向下坡。这就是梯度下降的做法:通过测量参数向量 θ 相关的损失函数的局部梯度,并不断沿着降低梯度的方向调整,直到梯度降为 0 ,达到最小值。

梯度下降公式如下:
在这里插入图片描述

对应到每个权重公式为:
在这里插入图片描述

其中 η 为学习率,是 0 到 1 之间的值,是个超参数,需要我们自己来确定大小。

算法原理:
在传统机器学习中,损失函数通常为凸函数,假设此时只有一个参数,则损失函数对参数的梯度即损失函数对参数的导数。如果刚开始参数初始在最优解的左边,
在这里插入图片描述

很明显,这个时候损失函数对参数的导数是小于 0 的,而学习率是一个 0 到 1 之间的数,此时按照公式更新参数,初始的参数减去一个小于 0 的数是变大,也就是在坐标轴上往右走,即朝着最优解的方向走。同样的,如果参数初始在最优解的右边,
在这里插入图片描述

此时按照公式更新,参数将会朝左走,即最优解的方向。所以,不管刚开始参数初始在何位置,按着梯度下降公式不断更新,参数都会朝着最优解的方向走。
梯度下降算法流程

随机初始参数;
确定学习率;
求出损失函数对参数梯度;
按照公式更新参数;
重复 3 、 4 直到满足终止条件(如:损失函数或参数更新变化值小于某个阈值,或者训练次数达到设定阈值)。

编程要求

根据提示,使用 Python 实现梯度下降算法,并损失函数最小值时对应的参数theta,theta会返回给外部代码,由外部代码来判断theta是否正确。
测试说明

损失函数为:loss=θ²−8θ+17loss=\theta²-8\theta+17loss=θ²−8θ+17
最优参数为:4.0
你的答案跟最优参数的误差低于0.0001才能通关。

# -*- coding: utf-8 -*-

import numpy as np
import warnings
warnings.filterwarnings("ignore")

def gradient_descent(initial_theta,eta=0.05,n_iters=1000,epslion=1e-8):
    '''
    梯度下降
    :param initial_theta: 参数初始值,类型为float
    :param eta: 学习率,类型为float
    :param n_iters: 训练轮数,类型为int
    :param epslion: 容忍误差范围,类型为float
    :return: 训练后得到的参数
    '''
    #********** Begin *********#
    theta = initial_theta
    i_iter = 0
    while i_iter < n_iters:
        gradient = 2*theta - 8  #梯度
        last_theta = theta
        theta = theta - eta*gradient
        if(abs(theta-last_theta)<epslion):
            break
        i_iter +=1

    return theta
    #********** End **********#
     

相关文章:

  • 如何使用github协作(修改远端仓库)
  • 工具使用之notepad++配置C/C++编译环境
  • javaweb期末开发项目笔记
  • Mysql安置配置过程中的问题及解决方法
  • 机器学习实验四 ——基于距离的层次聚类
  • 机器学习第二关——k-means算法流程
  • eclipse中怎么删除Web App Libraries重复的jar包
  • 常见Http响应状态码
  • 记录EduCoder实验平台的感受(答案匹配机制)
  • 二手车交易系统数据库的表格设计
  • eclipse建servlet 注解正确 却无法访问
  • 软件项目管理EAC、ETC的计算
  • 三点估计法计算完工可能性
  • 求解某项目的关键路径和总工期
  • 软件过程管理复习
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【个人向】《HTTP图解》阅后小结
  • Android框架之Volley
  • Angular 响应式表单之下拉框
  • CentOS 7 修改主机名
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • github指令
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • yii2权限控制rbac之rule详细讲解
  • 京东美团研发面经
  • 如何合理的规划jvm性能调优
  • 微信开放平台全网发布【失败】的几点排查方法
  • 我的面试准备过程--容器(更新中)
  • 线性表及其算法(java实现)
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • $ git push -u origin master 推送到远程库出错
  • (3)nginx 配置(nginx.conf)
  • (70min)字节暑假实习二面(已挂)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (八)Flask之app.route装饰器函数的参数
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (三)elasticsearch 源码之启动流程分析
  • ..回顾17,展望18
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Core中Emit的使用
  • ::前边啥也没有
  • @31省区市高考时间表来了,祝考试成功
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [20190113]四校联考
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [AAuto]给百宝箱增加娱乐功能
  • [Android] Implementation vs API dependency
  • [BZOJ2208][Jsoi2010]连通数
  • [C++]C++类基本语法
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】