梯度下降法及matlab实现

2023-05-16

个人博客文章链接:http://www.huqj.top/article?id=162

梯度下降法(gradient descent),是机器学习中最常用的参数调优算法,所谓梯度下降,就是对于一个模型的代价函数而言,从某个初始参数开始,逐渐将参数朝“使得代价函数减小最快”的方向调整,使得代价函数最终稳定在某个值左右。

举个例子,对于训练集数据:

1

training_data = [1 7.62 15.83 294 455 66.56 9110 225];

它的离散图像大致如下:

image.png

如果我们需要用一个函数来拟合它,那么最好是用一个二次或者更高次函数,假设我们使用二次函数:

y = θ0 + θ1x + θ2x2

来作为模型的函数表达式,那么我们就需要确定三个参数分别是多少才能够最大程度的符合训练数据,对于一次函数而言,我们知道可以使用最小二乘法来计算参数,同样,对于二次函数也有相应的数学方法可以确定参数值,但是一方面这样做不具有通用性,另一方面,也可能会出现没有最优解的情况,因此梯度下降法成为了一个较好的选择,它使用迭代的方式使得代价函数逐步减小,直到稳定在最小值附近,这样就可以得到参数的较优解。

 

梯度下降的数学原理如下:

①假设模型函数为 y = hθ(X),其中θ和X都是n维向量。

②代价函数表示当取某个θ向量作为参数时,模型计算出的结果和实际结果的误差,通常使用如下的函数来表示:

J(θ) = 1/2m * ∑i=1:m(hθ(Xi) - yi)2

其中m为训练集的数据个数,Xi表示第i个数据的自变量向量,yi为第i组数据的因变量,θ为某个参数向量。

③参数θ的迭代调整方法:

    image.png

带入上面的J(θ)和hθ(X)的定义可推导:

θj := θj - α(1/m) * ∑i=1:m(hθ(Xi) - yi)*Xi,j

这个写的可能有点不清楚,可以看下面这张图片里的公式:

image.png

这里描述了只有一个训练数据的情况,当有多个训练数据时,x和y都需要加上下标并求和,而j表示的是当前求偏导的自变量是xj, 需要和第几组训练数据相区分。

迭代中的α称为“学习率”,它揭示了梯度下降中的“下降速度”,也就是每次朝着代价函数减小的方向移动多少,但是学习率不能太大,太大可能会导致迭代发散。如下图所示:

image.png

因为学习率过大可能导致第一次迭代的时候就跳过了最小值从而代价函数越来越大。但是学习率过小也会导致训练速度缓慢,因此把握好学习率也是梯度下降中比较重要的一点。

迭代终止的条件通常是两次参数调节导致的代价函数值变化不大,或者迭代到了一定次数。

 

有了以上数学原理的铺垫,我们就可以写出梯度下降的代码了:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

function coe=GradientDecent(training_data, maxIndex, alpha, threshold, maxTimes)

    %测试梯度下降算法调整模型参数,参数为训练数据集和模型函数的最大系数,和学习率

 

    %测试参数预设

    training_data = [1 7.6;2 15.8; 3 29;4 45;5 66.5;6 91;10 225];

    maxIndex = 2;

    alpha = 0.0001;

    threshold = 0.0001;

    maxTimes = 5000;

     

    dataSize = length(training_data);

    dataLen = dataSize(1);

    plot(training_data(:,1), training_data(:,2), 'r*');

    hold on;

 

    paramLen = maxIndex + 1;

    theta = zeros(paramLen, 1);

    theta0 = theta;

    times = 0;

    cost0=0;

    cost1=1;

 

    % 迭代直到一定次数或者两次参数误差小于一定阈值

    while abs(cost1-cost0) > threshold && times<=maxTimes

        theta0 = theta;

        times = times + 1;

        cost0 = costFunction(theta', maxIndex, training_data);

        tmp = zeros(paramLen, 1);

        for j = 1:dataLen

            X = zeros(paramLen, 1);

            for k = 1:paramLen

               X(k) =  training_data(j, 1) ^ (k - 1);

            end

            for i = 1:paramLen

                tmp(i) = tmp(i) + (theta0' * X  - training_data(j, 2)) * X(i);

            end

        end

        for i = 1:paramLen

            tmp(i) = tmp(i) / dataLen;

            theta(i) = theta0(i) - alpha * tmp(i); 

        end

        cost1 = costFunction(theta', maxIndex, training_data);

    end

 

    theta0

    theta

    X = 0:0.01:10;

    Y = X;

    for i = 1:length(X)

        Y(i) = theta' * [1; X(i); X(i)^2];

    end

    plot(X, Y, 'b');

     

    coe = theta;

 

function delta=costFunction(theta, maxCoe, data)

    %代价函数,给定参数θ、模型变量指数最大值、训练数据,求代价函数值

     

    X = zeros(maxCoe + 1, 1);

    delta = 0;

    [len, ~] = size(data);

    for i = 1:len

       for j = 0:maxCoe

           X(j+1) =  data(i, 1)^j;

       end

       delta = delta + (theta * X - data(i, 2))^2;

    end

    delta = delta/(2 * len);

我们可以调节模型的自变量最大指数和学习率、阈值等来看看最终训练出来的效果有什么不同。

 

二次模型:

image.png

 

一次模型:

image.png

 

三次模型:

image.png

 

值得注意的是:对于不同的模型,学习率可能是不同的,例如这里对于一次模型而言,0.001的学习率就可以使得梯度下降收敛,但是对于二次模型却不行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

梯度下降法及matlab实现 的相关文章

  • matlab中优先级队列的实现方法

    matlab中有没有提供minpriorityqueue功能的库 import java util PriorityQueue import java util public class MyQueue Comparator
  • Matlab 中的 3D 堆叠条形图

    我想在一个图中绘制多个堆叠条形图 detached 条形图 例如 准确地想象一下bar http mathworks com help matlab ref bar3 detached png绘图 但堆叠在一起 而不是单一颜色 Set up
  • 在 numpy/scipy 中查找 matlab 函数

    是否有一个等价的函数find A gt 9 1 来自 numpy scipy 的 matlab 我知道有nonzeronumpy 中的函数 但我需要的是第一个索引 以便我可以在另一个提取的列中使用第一个索引 Ex A 1 2 3 9 6 4
  • MATLAB - 从目录读取文件?

    我希望从目录中读取文件并对每个文件迭代执行操作 此操作不需要更改文件 我知道我应该为此使用 for 循环 到目前为止我已经尝试过 FILES ls path to folder for i 1 size FILES 1 STRU pdbre
  • MATLAB;具有 2+ 个/分割图例的饼图 R2017b

    我正在创建一个饼图 理想情况下希望图例水平显示在顶部和 或底部 然而 在几乎所有情况下 这是不可能的 因为图例超出了数字 因此 我理想情况下希望将图例分成两个 或更多 子图例并单独放置它们 我知道这不是 MATLAB 中的内置功能 我使用的
  • 在matlab中融合2个以上的图像

    在 MATLAB 中 如何融合两个以上的图像 例如 我想要做什么imfuse但对于超过 2 个图像 使用两张图像 这是我的代码 A imread file1 jpg B imread file2 jpg C imfuse A B blend
  • Matlab的uicontrol在Octave中的实现?

    我正在尝试在 Octave 中运行我们实验室中使用的图形程序的 m Matlab 代码 Octave 告诉我代码中使用的函数 uicontrol 没有定义 经过一番搜索 我发现 JHandles 包有一个 uicontrol GUI 功能的
  • 了解 Matlab 中的 DEL2 函数以便用 C++ 对其进行编码

    为了用 C 编写 DEL2 matlab 函数 我需要了解该算法 我已经成功地为不在边界或边缘上的矩阵元素编写了函数 我已经看过几个有关它的主题 并通过输入 edit del2 或 type del2 来阅读 MATLAB 代码 但我不明白
  • MATLAB 中的内存映射文件?

    我决定使用 memmapfile 因为我的数据 通常为 30Gb 到 60Gb 太大 无法放入计算机内存中 我的数据文件由两列数据组成 对应于两个传感器的输出 并且它们采用 bin 和 txt 格式 m memmapfile G E Str
  • 如何使用 MATLAB 的“等值面”函数创建三角球体

    如何创建一个三角球体 其中每个三角形的面面积相同 我想要这样的东西 http imageshack us a img198 5041 71183923 png http imageshack us a img198 5041 7118392
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • Matlab-如何在曲线上绘制切线

    我在 matlab 中绘制了一个图表 plot x y 我的图表有不同的斜率 我如何在每个斜率上绘制切线并计算斜率的系数 如果您没有用于绘制点的显式函数 您可以使用有限差分 http en wikipedia org wiki Finite
  • 继续在 Matlab 中一遍又一遍地播放声音?

    我正在尝试创建一个 MATLAB 程序来每隔几分钟一遍又一遍地播放声音 现在我将其设置为每隔几秒播放一次 只是为了消除系统中的一些错误 但是 当我的程序尝试重播声音时 我收到此错误 Error using gt audioplayer au
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA
  • 如何让MCR启动时间快

    我将 matlab 程序转换为 net 程序集 即 dll 文件 我制作了一个控制台 C 应用程序 添加了 dll 文件并从 php 调用它 每次调用 exe 时都会调用 MCR 如何使 MCR 在服务器启动时初始化 并且即使在一段时间后调
  • Matlab PARFOR 循环可以通过编程方式打开/关闭吗?

    有一个关于 MATLAB 中 parfor 的简单问题 我想在程序中设置一个标志 以便在 parfor 和常规 for 循环之间进行更改 基本上 我需要此功能 以便我的代码的某些部分可以在 调试 模式下更新图形 然后当关闭该标志时 使用 p
  • 检查Matlab中脚本需要使用的函数

    我有一个别人写的代码包 我正在运行一个脚本 它调用一些函数 这些函数又调用更多函数 等等 我想获取不是 MATLAB 内置函数但属于包的一部分的函数列表 我尝试使用matlab codetools requiredFilesAndProdu
  • MATLAB 中最有效的矩阵求逆

    在 MATLAB 中计算某个方阵 A 的逆矩阵时 使用 Ai inv A should be the same as Ai A 1 MATLAB 通常会通知我这不是最有效的求逆方法 那么什么是更有效率的呢 如果我有一个方程系统 可能会使用
  • 在另一列中添加具有特定条件的一列,如 excel 的 sumif

    我有一个像这样的矩阵 A 1 2 2 3 3 4 4 5 5 6 6 8 7 9 8 5 9 4 现在我想添加第二列 条件是如果 limit 0 interval 3 且 limit limit interval 或者换句话说 当第 1 列
  • Python 函数句柄 ala Matlab

    在 MATLAB 中可以创建function handles http www mathworks co uk help techdoc ref function handle html与类似的东西 myfun arglist body 这

随机推荐

  • Centos7 java服务开机自启动

    1 在 etc systemd system 目录下 新建脚本 cd span class token operator span usr span class token operator span lib span class toke
  • 我使用过的linux命令之strings

    strings命令用于输出文件中可打印的字符串 不论文件是普通文本 xff0c 还是可执行文件 xff0c 任何文件都可以 最常用的选项 xff1a a 扫描整个文件的任何段 xff0c 这是strings的默认行为 xff0c 但是这种默
  • HashMap的工作原理

    HashMap主要是用来处理键值对数据 xff0c 随着JDK版本的更新 xff0c JDK1 8对HashMap的底层也做了一些优化 xff0c HashMap是基于哈希表对Map接口的实现类 xff0c 它的特点是访问数据速度快 xff
  • 如何配置终端代理apt 代理

    1 临时用代理 xff0c 直接在终端里export代理 export http proxy 61 http 127 0 0 1 7890 export https proxy 61 http 127 0 0 1 7890 2 在 etc
  • ssh修改连接端口,以及修改端口之后连接不上的问题

    SSh服务配置文件路径一般都是在 etc ssh这个目录下面 sshd config 这个文件 使用VI vim编辑器 xff0c 打开sshd config这个文件 xff0c 搜索找到 port字段 去掉 xff0c 修改port 后面
  • FreeRTOS原理剖析:任务的创建

    1 任务创建API函数 任务的最基本功能是任务管理 xff0c 任务管理中最基本操作是任务的创建和删除 对于任务的创建和删除 xff0c 由于篇幅有点长 xff0c 分两篇分别讲解 在FreeRTOS中任务的创建函数如下 xff1a 函数描
  • @xmlAttribute等注解它的用处?

    用的是jdk自带的javax xml bind JAXBContext将对象和xml字符串进行相互转换 如果对要生成的 xml 格式有点些许的限制 xff0c 就会对生成xml的对象就需要进行些许控制 xff0c 控制对象的一个最可行的办法
  • C/C++ 分支预测(likely unlikely)

    看一些代码时 xff0c 会遇到likely unlikely 查了查网上的资料 xff0c 结合自己的理解记录一下 1 一些概念 指令周期 是指执行一条指令所需要的时间 xff0c 一般由若干个机器周期组成 xff0c 是从取指令 分析指
  • Vnc viewer与windows之间的复制粘贴

    用VNC连接到Linux之后 xff0c 最纠结的问题就是无法复制粘贴 其实很简单 xff0c 在Linux里面 xff0c 打开一个终端 xff0c 然后输入命令 xff1a vncconfig 之后 xff0c 会弹出一个窗口 不要关闭
  • Android studio 添加多语言支持

    环境 xff1a Android studio 3 2 执行步骤 xff1a 一 生成对应语言文件夹 选中你的工程 gt res gt 右键点击new gt 选中Android resource directory Available qu
  • VNC 远程环境搭建教程

    最近因项目需要使用到 VNC 远程工具 xff0c 因此记录使用过程 一 在 VNC 官网下载 VNC 服务端和客户端安装包 进入下载页面 二 注册 VNC 官网账号 三 在本地安装 VNC 客户端 xff0c 被远程电脑安装 VNC 服务
  • Ubuntu桌面出现Accept clipboard from viewers,Send clipboard to viewers,Send primary selection to vi等三行错误时

    如上图的错误时 1 输入以下神秘代码 sudo apt get install gnome core2 重启vnc服务3 若还不行 xff0c 则修改xstartup脚本 方法见下链接第五部分 修改xstartup
  • Python+ADB实现Android手机QQ自动点赞

    1 前言 前段时间看了些爬虫的知识 xff0c 然后又看到selenium xff0c Appium xff0c 在Appium环境设置过程中 xff0c 意外地看到这个帖子adb命令模拟按键事件 KeyCode xff0c 然后结合相关搜
  • Go语言汇编入门

    虽然在前面的文章中 xff0c 分析代码已经接触了一些Go语言的汇编代码的注解 xff0c 比如在slice和Go语言笔记以及以后的文章中都会使用到Go汇编 本章主要讲解Go汇编大致流程的框架 xff0c 对于刚接触Go汇编理解Go函数栈是
  • Holistic++ Scene Understanding论文翻译解析笔记

    Holistic 43 43 Scene Understanding 摘要 我们提出了一个新的3D整体场景理解问题 xff0c 它l共同解决了单视角图片的两个问题 xff08 1 xff09 整体场景的语义分析和重建 xff08 2 3D人
  • windows server 2012R2制作qcow2镜像

    一 环境准备 xff1a 1 windows server 2012R2的iso镜像 2 物理机一台 xff1a 要求支持硬件虚拟化 xff0c 并且装好了centos系统 xff0c 在windows上安装vmware 然后在vmware
  • VNC无法连接,出现“TOO MANY SECURITY FAILURES”(安全故障太多)

    通过VNC VIEWER远程管理 xff0c 连接的时候报错 too many security failures 这是因为VNC的黑名单机制 xff0c 用来保护你的服务器 如果有人暴力破解 xff0c 将会触发VNC的黑名单机制 处理方
  • java.sql.SQLException: #HY000

    勾选自动递增 将 type类型改成int xff0c binyint是boolean xff0c 类型是1 xff0c 2 xff0c 3 xff0c 4 xff0c 不是true false 就好了
  • jqgrid表格高度宽度设置

    jqgrid表格高度宽度设置 问题说明 gt 页面上使用上面搜索框 xff0c 下面是jqgrid表格形式 xff0c 总是出现 xff0c grid表格加载宽度 高度问题 本文通过主要解决表格高度宽度变化适应的问题 grid宽度 1 修改
  • 梯度下降法及matlab实现

    个人博客文章链接 xff1a http www huqj top article id 61 162 梯度下降法 xff08 gradient descent xff09 xff0c 是机器学习中最常用的参数调优算法 xff0c 所谓梯度下