news 2026/10/21 6:16:41

机器人地图服务模块实战:从SLAM到混合A*/DWA的导航落地

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机器人地图服务模块实战:从SLAM到混合A*/DWA的导航落地

1. 项目概述

1.1 它到底是什么

lingbot-map 是一个我最近在做的智能机器人地图服务模块。简单说,它是给轮式机器人、服务机器人、甚至是一些轻量级 AGV 小车提供“认路”能力的核心组件,主要解决三件事:地图怎么建模、路径怎么规划、导航过程中遇到障碍物怎么临时避让。

这类功能听起来像是自动驾驶才需要的东西,但实际上,任何一台需要在固定场景里自主移动的设备都逃不开这套逻辑。比如你在餐厅里看到的送餐机器人,它要能知道自己在哪、要去哪、中间有没有人被挡路,这就是 lingbot-map 这类模块在背后支撑的。我把它单独拆成一个项目来做,而不是让地图功能散落在机器人主程序里,是因为地图相关的逻辑往往是最容易出 bug、也最需要被反复调试的一块。单独模块化之后,无论是室内新场景的快速部署,还是算法层面的迭代替换,都不会牵一发动全身。

这个内容适合谁看?如果你是做机器人应用开发的工程师,或者是在校学生想理解地图模块与运动控制之间是怎么对接的,又或者你只是有个 Arduino 小车想在房间里跑起来不乱撞,这篇文章都能给你一个可以抄作业的参考方案。我不准备堆一堆学院派的理论名词,而是把 lingbot-map 从需求拆解、架构设计到落地实现的过程完整梳理一遍,包括踩过的坑和一些不太好查到的细节经验。

1.2 解决的核心痛点

任何一个做机器人移动方案的人,最头疼的往往不是“写代码”本身,而是下面这几件事:

  • 地图从哪来:现成的开源 SLAM 方案真正落地到某个具体场景时,需要很大的工程适配工作量,小白上手门槛髙。
  • 路径规划不可控:很多开源路径规划库偏重算法层面的完备性,但真放到真实场景里,机器人对着一个细小的桌腿反复试探、原地打转,体验很糟糕。
  • 与底盘/业务系统难对接:地图模块如果和上层业务逻辑耦合太深,数据格式不统一,后续换底盘或者换场景,就得重写一大片。

lingbot-map 的定位就是把这些琐碎又关键的工作收敛起来,对上层提供一个统一的地图服务和导航服务接口。它不求像自动驾驶那样在全天候开放道路行驶,但在室内结构化环境里,它能做到“构建快、定位稳、路径好维护”。这也是我在拆这个项目时给自己定的硬性要求。

2. 整体设计与模块拆解

2.1 为什么我没有从零写一个 SLAM 算法

先聊一个很多同学会纠结的点:做地图模块,要不要自己去实现 SLAM(同步定位与建图)?我的选择是,并不重复造轮子。地图的“采集”和“服务”是两个层次的问题。SLAM 负责研究怎么从传感器数据里估计位姿并重建环境,而 lingbot-map 的核心职责则是:把建好的地图管理好、把导航请求处理好、把底层底盘差异屏蔽掉。

所以我采用了“数据源可插拔”的架构。lingbot-map 本身不强制绑定某一种 SLAM 算法的输出格式,只要你能把地图数据(栅格地图或者几何地图)转成统一的中间格式,lingbot-map 就能加载它并提供路径规划服务。这样做有几个非常实际的好处:

  • 换传感器方案不影响上层业务。激光雷达方案可以,视觉方案甚至纯人工标注的地图也可以。
  • 建图与导航解耦。建图质量可以单独评测、单独优化,导航逻辑不会掺和到构图噪点之类的问题里去。
  • 算法迭代空间大。以后如果出现更好的路径搜索算法,只需要替换内部某个插件,对外接口不必变更。

从工程尺度看,这就是典型的依赖倒置。我们依赖的是“地图数据接口”这个抽象,而不是某个具体的算法实现。

2.2 模块划分与数据流

lingbot-map 内部拆成了五个部分:

  • 地图数据层:负责地图文件的解析、坐标系管理、地图元信息抽取。这是最容易被低估的一块,实际上 70% 的疑难杂症都出在坐标和高精度的边界问题上。
  • 全局规划层:在全局地图上搜索出一条从起点到目标点的最优路径。我选了 Hybrid A* 做全局搜索,并在其后接了一条轻量轨迹平滑流程。
  • 局部规划层:也叫运动规划层,负责跟随全局路径的同时,感知实时障碍物并进行速速和方向的微调。它和底层底盘控制器之间有一套内置的适配接口。
  • 状态估计层:实时推算机器人当前在地图里的位姿(位置加朝向)。这里我用的是 AMCL 的蒙特卡洛定位思路,但做了轻量化裁剪。
  • 业务接口层:以 RESTful 接口加 WebSocket 推流两种方式对外提供服务,方便上层餐饮系统、巡检系统集成。

数据流大概是这样:上层业务发起导航请求 → lingbot-map 拿到请求,从全局规划层得到路径 → 局部规划层结合实时障碍物信息输出速度指令 → 底盘执行 → 状态估计层持续修正位姿,闭环反馈给规划层。整个环路的节拍在 20Hz 左右,既不会给主控 CPU 造成太大压力,又能保证避障的实时性。

这个设计里我最想强调的一点是:千万不要让业务系统直连底层传感器数据。中间多一层“规划输出 + 状态反馈”的抽象,虽然会增加一次数据转换的开销,但这部分开销撑死几毫秒,换来的却是极高的可维护性和调试友好度。实际的商业项目中,这部分投资回报比是最划算的。

3. 核心路径规划算法落地

3.1 全局路径搜索:为什么要重视曲线平滑

很多入门阶段的项目都会选择 A* 或者 Dijkstra 来做全局规划,代码量小、见效快。但这类算法天然有一个问题:搜出来的路径是由网格中心点连接而成的折线,带有明显的锯齿和直角转弯。机器人底盘如果直接跟踪这种路径,会出现行进路线抖动、原地减速再转向的现象,甚至在窄通道里绕不过弯。

lingbot-map 在全局规划里用了 Hybrid A*。它跟普通 A* 的本质区别在于:状态空间从“网格节点”变成了“带航向的车辆姿态”。搜索过程中考虑的不仅是“这个格子能不能走”,还得考虑“以当前朝向的车能不能平滑地开到这个格子的这个朝向”。

这会带来两个工程上的收益。第一,搜索出的路径天然符合车辆的运动学约束,不会出现原地掉头这种让底盘工程师崩溃的奇葩轨迹。第二,后续不需要做太重的样条平滑,就能得到较为顺滑的行驶轨迹。我在实测中对比过,同样的地图和起终点,传统 A* 加后处理平滑的方案,路径总转角大概是 Hybrid A* 的两倍以上,直观体验就是车子行驶过程明显更果断。

Hybrid A* 也不是没代价。它的计算量显著高于普通 A*,尤其当搜索空间维度增加后,如果地图尺寸较大,内存占用和搜索时间都会上来。在 lingbot-map 里的处理方式是做两层搜索:先用低分辨率的粗略地图快速寻找走廊级别的可行通路,如果这条路存在,再在局部窗口里用高分辨率精细搜索去平滑路径细节。实际效果是,大多数场景下全局规划耗时都能控制在 100 毫秒以内。

3.2 局部避障:动态窗口法的工程调参心得

全局路径是一条静态参考线,机器人真正上路之后,面对的还有行人、椅子、临时堆放的杂物。这部分功能由局部规划器承担。lingbot-map 选择了动态窗口法(DWA),它在移动机器人圈子里算是应用最广的方案之一,原因也很朴素:计算可控、参数直观、效果稳定。

DWA 的核心思路是在每一个控制周期内,枚举一组可能的“速度 + 转角速度”组合,它把搜索空间限制在底盘可达的“动态窗口”内。然后对每一组候选速度,模拟一段时间内的运动轨迹,依据轨迹与全局路径的贴合度、与障碍物的距离、朝向目标点的程度三项指标加权打分,选最优。

我调参时踩过几个坑值得专门说一下:

  • 评价函数的权重非常敏感。障碍物距离权重如果低于路径贴合权重太多,机器人会为了贴近路径而跟障碍物硬刚;反过来权重太高,遇到窄通道机器人会直接停下来认定“无路可走”。我这边调出来的一组比较稳的参数是:路径贴合权重 0.6,障碍物距离权重 0.35,朝向目标权重 0.05。注意这个比例要配合上模拟步长一起调。
  • 模拟时间步长不宜太长。刚开始我把前向模拟时长设到 3 秒,结果机器人面对一个转角时,因为模拟轨迹“看到”了远处的墙体,提前减速,导致转弯半径偏大。缩短到 1.5 秒后,短时避障更灵敏,整体的跟线精度反而更好。
  • 速度采样分辨率不要贪细。分辨率过细并不会显著提升轨迹质量,反而把耗时放大数倍。实测下来,线速度步长 0.05 米/秒,角速度步长 0.1 弧度/秒,20Hz 实时跑已经绰绰有余。

3.3 从全局路径到局部控制指令的衔接

这个衔接细节很少在论文里被仔细交代,但在实际开发中格外重要。全局规划输出的是一串密集的路径点,而局部规划器需要的是一条抽象的“参考路径”。 lingbot-map 里专门做了一个参考路径管理模块,它负责:

  1. 根据机器人当前位姿,在全局路径上找到最近的参考点。
  2. 往前截取一段约 2 米长的窗口,作为局部规划器的目标参考线。
  3. 参考线在每次控制周期内增量更新,避免因全局路径长距离变化带来的抖动。

如果这一步处理得不好,最典型的现象就是机器人会出现“往前往后又往前往后”的喘振姿态,看起来像在犹豫。根因往往是参考点切换逻辑不够平滑,或者截取窗口长度与 DWA 的模拟范围不匹配。lingbot-map 里这个窗口长度是动态的:直线段长一些,弯道前自动缩短,让机器人进弯前有更充足的减速和调整空间。

4. 地图数据模型与坐标系工程化

4.1 一张地图的数据结构里藏了多少细节

聊完算法,我们回到一个更基础的层面:地图本身。lingbot-map 的默认地图格式是栅格地图,本质是一张灰度图加一个分辨率声明。每个像素对应地面的一个小格子,黑色像素代表有障碍物,白色像素代表可通行,灰色则是未知区域。

但仅仅这样是不够的。工程化的地图文件还得包含这些关键信息:

  • 原点坐标:地图左上角像素在真实世界坐标系下的位置。
  • 分辨率:每个像素对应的物理尺寸,单位米/像素。常见设置是 0.05,也就是 5 厘米一个格子。
  • 楼层与场景标识:多层建筑或者多门店场景下,同一张地图文件内就需要带场景编号,防止导航请求串区。
  • 禁区多边形集合:某些区域不允许机器人进入,比如收银台后方的狭窄过道。这类需求直接在导航层屏蔽会更可靠,而不是单纯靠传感器避障。

我强烈建议任何地图模块的设计者,从第一天起就把这些元信息纳入地图文件格式里。后续你会感激自己这个决定。因为在实际部署时,光是“这张地图是哪个场景的”“原点坐标到底在哪”这两个问题,就能让现场调试的同学疯掉。地图数据格式统一,是救命级别的设计。

4.2 坐标变换:最容易被低估的 bug 温床

坐标变换是一个不能不谈、谈起来又特别容易让新手头大的话题。lingbot-map 里至少要维护四套坐标系:

  • 世界地图系:地图像素坐标映射到真实世界的参考系。
  • 机器人本体坐标系:原点在机器人中心,朝向为机头朝向。
  • 雷达/传感器坐标系:传感器安装位置一般不在机器人中心点,有一个固定的外参偏移。
  • 里程计坐标系:底盘累积位移推算出来的相对坐标系。

这四个坐标系之间的转换关系稍微乱一点,机器人立刻表现出“猛打方向盘”或“定位漂移”等异常。lingbot-map 的做法是建立统一的坐标树管理机制,任何时候传感器数据进入系统,第一件事就是换算到世界地图系,后续所有算法模块只认世界系数据,不直接消费本地坐标数据。

这里有一个血泪经验:外参标定不能只依赖标定工具的输出。雷达安装哪怕出现 1 度的角度偏移,在 10 米外就会造成约 17 厘米的位置误差,对一个轮径 30 厘米的机器人来说,这是足以引发碰撞的大偏差。发布前的实测检查里,要专门写一条“直线行驶 10 米验证地图贴合度”的用例,这个用例能筛查出大量软件层面看不出来的标定问题。

4.3 地图的实时更新与动态避让区域

真实场景中除了静态地图,还需要机器人支持临时避让。lingbot-map 引入了一张“动态栅格图层”,它与静态地图叠加:静态地图提供长期可信的几何约束,动态图层则反映了最近几秒内传感器观测到的障碍物状态。

为什么需要动态图层,而不是让局部规划器直接消费原始雷达数据?原因是 DWA 这类局部规划器每次只处理一小段轨迹,它对障碍物的感知是短视的。如果通道前方 3 米处放了一个临时纸箱,机器人可能等靠近了才发现并猛减速。而动态图层可以做到提前把临时障碍物“写进地图”,让全局规划在下一次重规划时就绕开箱子,而不是到了跟前才想办法。

动态图层的更新频率不需要太高,5Hz 甚至 2Hz 就够了。它只需要保证:静态障碍物被快速遗忘(避免把墙边正常行人当永久障碍),动态障碍物被较快保留(让路径规划有机会绕行)。这里我用了一个简单的指数衰减机制:每次新的雷达帧到来,命中动态图层上的格子就增加置信度,没命中的格子置信度按比例下降。低于阈值就清除出动态图层。实测下来,这个机制对推着餐车慢慢走动的人特别有效,不会再出现“人已经走远了,机器人还固执地认为前方有障碍”的状态。

5. 实操过程与踩坑实录

5.1 完整落地的步骤清单

下面按实际操作的顺序,把 lingbot-map 从零到一的落地步骤完整列一遍。假设你现在手里有一台差速驱动机器人,装了 2D 激光雷达,主控是一块带 Ubuntu 系统的迷你主机。

第一步:确认底盘和雷达的驱动接口可用

先把底盘驱动跑起来,订阅它的里程计话题,确认能稳定输出位姿增量;再确认雷达话题能输出高质量的点云数据。我遇到过雷达数据帧率波动严重的场景,后面定位稳定性受到明显影响,所以这一步不要图快。

第二步:编写底盘和雷达的适配插件

这一步是把传感器与 lingbot-map 对接的桥接环节。如果你用的是常见的开源机器人套件,这一步通常只是配置参数、启动已有插件;如果是自制底盘,就需要写一个将底盘电机的编码器数据换算成里程计消息的节点。

第三步:完成一次建图

启动 SLAM 建图工具,把机器人放到待部署场景的起点,手动遥控它走遍场景的每一个角落。这一步的关键是:路径覆盖要交叉重叠,保证回环闭合。我见过很多新手建图喜欢走“贪吃蛇”路线,一条道走到黑再掉头,结果地图出现明显畸变。正确做法是像扫地一样,从左到右扫一层,再从右往左覆盖回来,保证同一区域被多次观测。

第四步:编辑地图文件

建图完成后导出的地图,通常还需要手动干预一下。用图像编辑工具把地图里误检的噪点清掉,把玻璃墙这类在雷达下不可见、但实际存在的物理边界手动补上,再标注禁行区域。这一步看似人工,却是提升导航可靠性的最高性价比操作。

第五步:配置 lingbot-map 参数

把前面调好的 DWA 参数、全局规划参数、定位参数分别写入配置文件。特别要注意的是地图路径、坐标系外参、话题名映射这几类与具体硬件强相关的配置,最好独立出来一个文件,换机器的时候只改这里。

第六步:联调与实车测试

先用仿真环境跑一遍全流程,确认路径规划输出合理性,再上实车。第一次实车建议在地面空旷、无真实障碍物的区域,重点验证定位初始化和路径跟踪,而后再进入真实场景做避障测试。

5.2 定位初始化失败的一个案例

联调阶段我遇到过一个非常典型的问题,值得拿出来讲:机器人启动后,定位状态一直停在“未初始化”,即使手动给了粗略初始位姿,蒙特卡洛粒子也始终无法收敛。

排查过程是这样的:先确认了点云话题有数据、帧率正常,然后打印出了每个尝试位姿的粒子权重分布。发现粒子权重分布非常平缓,所有粒子得分都差不多,这意味着重试位姿与当前观测的匹配度都很低。接着我对比了雷达观测与地图本身,才发现地图里走廊尽头有一面墙,在真实环境里已经被打开成一个门洞——但建图时门是关着的,所以地图上依然画着一堵墙。雷达穿过门洞看到门后的空间,与地图上的墙产生了严重矛盾,粒子自然无法打分。

解决方案不是改定位参数,而是重新补录了一段地图数据,把这块区域更新成准确的状态。这件事的教训是:定位失败时,先怀疑地图与现场的一致性,不要急着调参。很多时候现场的物理环境已经发生变化,地图没有同步更新,算法再好也无济于事。

5.3 一个反复出现的路径抖动问题

另一个常见问题是:机器人在直线行驶过程中,横向误差波动明显,走出一段“S 形”轨迹。最开始我怀疑是路径跟踪的 PID 参数没调好,试了好几组参数,效果都不理想。

后来在调试日志中发现,局部规划器每秒钟会频繁地在左右两侧切换目标参考点,原因在于全局路径的相邻点间距与粒子定位的微小抖动产生了共振。解决方法是把参考点选择逻辑从“最近距离点”改成“最近但渐进推进点”,也就是一旦选定了参考点序号,后续参考点的序号只能单调递增,不能回退。这个小改动让路径跟踪稳定性提升了非常多,“S 形”抖动基本消失。

5.4 常见问题速查

我把调试过程里最容易遇到、也最值得收藏的问题整理成了一张表,很多时候你遇到的问题症状看着复杂,其实根因就那么几个:

现象首选排查方向补充建议
定位初始化失败地图与真实环境不一致补测现场变化区域,重点检查门、窗帘、反光墙面
路径跟踪呈S形参考点选择逻辑抖动排查全局路径参考点是否单调递增推进
机器人原地打转局部规划权重失衡检查障碍物距离权重比重是否过低
全局规划耗时过长搜索分辨率与地图尺寸不匹配尝试两层搜索策略,粗搜加精修结合
同一场景重复部署不收敛地图原点与定位初始位置不对应检查地图原点坐标与机器人实际启动位置是否真正一致
避障过晚、刹车太急动态地图层更新频率过低适当提高动态图层更新节奏,同时调大障碍物膨胀半径

6. 关键参数与调优经验

6.1 六个影响导航效果最直接的参数

如果说整个项目里哪一个环节性价比最高,那就是参数调优。很多功能跑不起来,不是代码架构问题,单纯就是参数没给对。lingbot-map 的导航核心是 DWA 加 Hybrid A*,我直接亮一套自己实测效果不错的初始值,但请注意,数值可以抄,背后的调参逻辑必须自己理解。

  • 全局地图分辨率:0.05 米/像素。再细的话网格数会爆炸,再粗的话窄通道不够可靠。
  • 局部规划频率:20Hz。
  • 前向模拟步长:0.1 秒。太短会短视,太长会提前减速,0.1 是一个平衡点。
  • DWA 线速度窗口:最大 0.6 米/秒,最小 0.05 米/秒。室内场景建议不超过 1 米/秒,否则安全性会快速下降。
  • DWA 角速度窗口:最大 1.0 弧度/秒。转角速度过大会给底盘带来明显冲击。
  • 障碍物膨胀半径:比机器人外接圆半径多出 10 厘米。这个值必须依据现场最窄通道的宽度做调整,如果最窄门洞刚好只够机器人过,膨胀半径必须设置得很小,同时要依赖局部避障做动态兜底。

6.2 调参顺序:先保证安全,再追求效率

我的建议是调参时遵循“先能跑、再跑稳、后跑快”的顺序。

先把障碍物距离权重的下限锁死,确保任何情况下机器人不会跟障碍物“贴脸”,这是安全底线。然后调整路径跟踪相关的参数,让机器人能稳稳地跑在全局路径上。当稳定性满足要求后,再去提升最大线速度、缩小膨胀半径这些与效率直接相关的参数。每一步的调整幅度要小,每次只改一个参数,改完立刻在地图上固定几条测试路线反复跑同一遍,对照参数变化前后的轨迹差异。

很多想快速见效的同学会同时改三个参数,一旦效果变差了,根本分辨不清是哪一项引起的。这种“混合调参”的调试方式,只会把问题越调越复杂。在参数调优上,慢就是快。

7. 对后续扩展的一些想法

7.1 多楼层与多机器人复用

lingbot-map 当前主要解决的是单层室内场景。往后续扩展,最顺理成章的方向有两块。

一是多楼层地图管理。电梯场景会带来定位跳变和地图切换两个大难题,需要在楼层切换时重新触发一次全局定位初始化,可以在电梯口放置二维码或者地标,帮助机器人快速找回初始位姿。

二是多机器人共用同一套地图服务。同一场景下如果有两台机器人在跑,地图文件、动态障碍物图层可以共享,但需要额外实现“机器人间互斥”以及“交通管制”能力,避免在窄通道里两车相逢却都进不去也退不出的死锁。这个问题会很有趣,但也牵涉到通信系统与调度系统,值得作为独立的话题再展开。

7.2 让地图模块成为团队基础设施

我在做这个项目时最大的体会是:地图模块不应该被看成某个机器人身上的“一个零件”,它其实是可以复用的团队基础设施。当第二台、第三台机器人需要接入时,它们不需要知道地图文件是怎么生成的,不需要关心路径搜索算法的实现细节,只需要对着同一套接口发导航请求、收状态反馈。这种基础设施化的思路,能让后续所有机器人的导航需求都站到同一条起跑线上。

如果你正在规划自己的机器人项目,我强烈建议你也把地图服务单独抽出来,从一开始就把接口定义清楚。哪怕前期看起来多写了一些代码,后期节省的时间和避免的麻烦,一定远超你的预期。

最后分享一个小技巧:所有地图文件在落地时记得加一个版本哈希字段,任何一次地图修改都会改变哈希值。当现场反馈导航异常时,先对哈希值,确认跑的程序到底匹配的是哪一版地图。这个习惯帮我避免过很多次“你以为你改的是新版,实际跑的还是旧版”的低级事故。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 6:16:33

Redis压缩列表与listpack:底层内存优化与连锁更新机制解析

我们平时写业务代码,很少会去抠一个键在内存里的真实样子,但一旦碰上内存暴涨、响应抖动,又不得不回头去看底层结构。就拿 Redis 里最常见的列表和哈希来说,你在使用的时候可能根本没意识到,当元素个数很少、单个元素又…

作者头像 李华
网站建设 2026/10/21 6:16:22

Windows性能数据采集:PDH API从入门到实战

做 Windows 上的性能采集,绕不开 PDH 这个词。我最早认真研究 PDH(Performance Data Helper)是在写一个轻量监控客户端的时候:每隔一两秒要从本机甚至远程机器上拿 CPU、内存、进程级 CPU 占用,然后推给中心端汇总。一…

作者头像 李华
网站建设 2026/10/21 6:15:51

Fiddler Script 实战:拦截修改手游 WebSocket 封包与二进制协议

做移动端网络联调的时候,HTTP层面的抓包几乎算不上难题:给手机挂一个代理,打开Fiddler,所有请求响应的结构、参数、状态码都能看得一清二楚。可一旦游戏切换到了WebSocket长连接,很多人的工具链就当场失灵。原因其实不…

作者头像 李华
网站建设 2026/10/21 6:15:43

OpenClaw 5分钟极简安装指南:从环境准备到实战应用

OpenClaw 这个名字,最近在不少开发者群里出现的频率明显高了不少。我最初注意到它,是因为一个朋友团队的自动化工作流项目,跑得比预期顺,问了一圈才发现底层调度用的就是 OpenClaw。自己动手装了一遍之后,说实话&#…

作者头像 李华
网站建设 2026/10/21 6:15:39

《驾驭你的AI同事:WorkBuddy深度精通》046:连接器架构专题

《驾驭你的AI同事:WorkBuddy深度精通》046:连接器(Connector)架构专题 本文是《唤醒你的 AI 同事:WorkBuddy 全栈指南》系列 卷二(深度精通) 的第 46 篇。卷一讲过"连接器怎么用",本篇换个角度:连接器在架构里到底处于哪一层、它和 MCP 与技能的分工是什么、…

作者头像 李华
网站建设 2026/10/21 6:14:52

广义回归神经网络GRNN:小样本疾病诊断分类的实用利器

我最早接触广义回归神经网络(GRNN)这个模型,是有一次在做医学检查数据的疾病分类任务时,用BP神经网络反复调参调到怀疑人生。隐藏层节点数怎么定、学习率设多少、迭代多少次,各种组合试了一圈,效果始终不够…

作者头像 李华