LGD Momentum 算法测试

目的 分析与测试带动量的LGD方法的搜索效率与算法特性。 算法分析 LGD算法的核心是步长随机的梯度下降法,其中步长取值符合莱维分布。这样做带来的好处主要有两个: 因为步长的最大取值为无限大,因此理论上算法具有全局收敛性。给定足够的搜索次数,算法一定会发现全局最优解; 搜索过程顺带对解空间的形态(起伏)进行了探索,因此可利用搜索路径的统计信息给出解的不确定度。 但也有一个缺点:由于在地球物理反演中一般会采用正则化的方法改善反演问题的奇异性,因此一些解空间的凹性质并不突出,这使得LGD在大多数迭代步骤中下降量不足。为了增加LGD的下降效率,同时保留其优点。考虑到Adam这类的最优化方法具有良好的下降效率和一定的全局最优性。因此计划在LGD算法中引入类似的动量概念,提升迭代效率。 下面是带有动量的LGD算法的简单分析: // 这里我们考虑一个二维最优化问题 // 首先计算归一化的迭代方向(这使得对动量和梯度模的直接统计没有了意义) // 迭代方向乘步长得到迭代矢量(这是我们真正想记录的量,它直接决定了迭代路径) direct_mod = sqrt(g2[0]*g2[0] + g2[1]*g2[1]); g2[0] = levy_length*g2[0]/direct_mod; g2[1] = levy_length*g2[1]/direct_mod; // 计算修正系数 mt *= beta_m; vt *= beta_v; // 利用指数平均对动量与梯度模进行估计(有偏的) m[0] = (beta_m*m[0] + (1.0 - beta_m)*g2[0]); m[1] = (beta_m*m[1] + (1.0 - beta_m)*g2[1]); v[0] = (beta_v*v[0] + (1.0 - beta_v)*g2[0]*g2[0]); v[1] = (beta_v*v[1] + (1.0 - beta_v)*g2[1]*g2[1]); // 对动量与梯度模进行校正 mhat[0] = m[0]/(1.0 - mt); mhat[1] = m[1]/(1.0 - mt); vhat[0] = v[0]/(1.0 - vt); vhat[1] = v[1]/(1.0 - vt); // 利用动量与梯度模进行迭代(此处不再需要乘以步长了) x2[0] = x2[0] - mhat[0]/(sqrt(vhat[0]) + 1e-8); x2[1] = x2[1] - mhat[1]/(sqrt(vhat[1]) + 1e-8); 模型试验 对比二维非凸问题的搜索过程(见下图,其中白色为LGD_Momentum的搜索路径,黑色为LGD搜索路径,红色为Adam算法的搜索路径),在实验过程中,两种LGD算法每次迭代的步长取值都是一样的,Adam算法的步长为LGD搜索步长的平均值,LGD算法的搜索次数为1000次。对比下图可见: Adam算法的搜索范围很小,直接陷入了局部极小值; LGD算法的搜索范围最大,路径总体呈放射状,搜索效率受到了一定的影响; LGD_Momentum算法的搜索范围较小一些,全局收敛性较LGD更弱,但更集中于极值附近,搜索的效率整体更高。 迭代路径对比图 问题 怎样更直观地对比LGD与LGD_Momentum的求解效率? LGD_Momentum在地球物理反演中是否更优?

December 26, 2024 · 张壹

一个简单的GMT动画例子

使用GMT程序包内的movie命令可以生成动画,更好地展示数据的动态变化。下面是一个利用该命令绘制动画的简单例子: 您的浏览器不支持视频标签 1. 准备程序 首先编写动画背景图的生成脚本,包括生成绘图所需的数据等工作也可以在此完成(如果已有外部数据则不需要)。在实际运行中不需要手动执行此脚本,而是通过movie命令调用。 # 使用heredoc方式将脚本保存到一个shell文件pre.sh # 在<<后添加-表示忽略tab制表符(注意不会忽略空格) cat <<- EOF > pre.sh # 使用gmt math生成数据,=号后接输出文件名称 # -T命令指定x坐标范围 # T SIND指定要计算的函数名称 gmt math -T0/360/10 T SIND = sin_point.txt gmt math -T0/360/1 T SIND = sin_curve.txt # 开始绘制底图 gmt begin # 使用gmt basemap绘制一张空的底图 具体的名称含义查看gmt文档 # -R指定坐标范围 -JX指定投影类型和地图大小 -X -Y平移图像 # -B指定坐标轴样式(包括ticks、labels和grids设置等) # --FONT_ANNOT_PRIMARY设置字体大小 gmt basemap -R0/360/-1.2/1.6 -JX22c/11.5c -X1c -Y1c \ -BWSne+glightskyblue -Bxa90g90f30+u@. -Bya0.5f0.1g1 --FONT_ANNOT_PRIMARY=9p gmt end # 结束 EOF 2. 准备主程序 编写动画生成的主脚本。movie命令内置了一批常量和变量可供使用,其中常量包括: ...

December 25, 2024 · 张壹

Visualising and plotting data with gnuplot

Introduction Data visualisation is extremely important for communicating the results of your research, either in a journal or to the general public, and for analysing and learning more about the characteristics of your data and system (so-called “exploratory data analysis”). One of the most fundamental tools in data visualisation is the two-dimensional plot (or graph). This tutorial will cover the basics of two-dimensional data visualisation using a program called gnuplot; a program which allows you to create high-quality, visually-pleasing figures and undertake robust post-hoc data analysis. ...

March 31, 2023 · Emily Kahl

PLY格式介绍

PLY 格式是在 1990 年代由 Greg Turk 和斯坦福图形实验室的其他人开发的,这也是它被称为斯坦福三角格式的原因。自那时起,该文件格式一直保持 1.0 版本,没有进一步的修改。 文件格式 一个简单的 PLY 对象由一组用于表示对象的元素组成。它包含一个顶点列表(由(x,y,z)三元组组成)和一个面列表(实际上是顶点列表的索引)。顶点和面是两种元素的例子,而大多数 PLY 文件主要由这两种元素构成。此外,还可以创建新的属性并将其附加到对象的元素上,这些但属性应以一种不会破坏旧程序的方式添加,以便旧程序在遇到这些新属性时仍能正常运行。读取应用程序也可以忽略这些属性。此外,还可以创建新的元素,并为这些元素定义属性。 PLY 文件格式的文件结构如下: 文件头 顶点列表 面列表 其他元素的列表 示例结构 在后续讨论中,我们将使用以下示例来说明 PLY 文件格式的各个部分。 ply format ascii 1.0 { ascii/binary,格式版本号 } comment made by Greg Turk { 以 comment 关键字开头的注释 } comment this file is a cube element vertex 8 { 定义“顶点”元素,文件中有 8 个 } property float x { 顶点包含浮点数“x”坐标 } property float y { y 坐标也是顶点的属性 } property float z { z 坐标也是 } element face 6 { 文件中有 6 个“面”元素 } property list uchar int vertex_index { “vertex_indices” 是一个整数列表 } end_header { 标记头部的结束 } 0 0 0 { 顶点列表的开始 } 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 4 0 1 2 3 { 面列表的开始 } 4 7 6 5 4 4 0 4 5 1 4 1 5 6 2 4 2 6 7 3 4 3 7 4 0 文件头 PLY 文件格式的文件头由 ASCII 文本组成,无论是 ASCII 格式还是二进制格式都是如此。头部部分的开始和结束由ply和end_header关键字标识。头部的开始有一个魔术词ply,用于让读取器识别 PLY 文件格式。下一行显示了该文件的版本号。PLY 文件格式中的注释以comment关键字开头。 ...

张壹