对比 5 种常见的一维搜索(optimization / line search)方法:
🧭 五种典型一维搜索算法
(从“只看函数值” → “利用导数” → “全局搜索”)
方法 | 是否用导数 | 是否需单峰 | 优势 | 劣势 | 常见应用 |
1️⃣ 网格搜索 (Grid Search) | ❌ | 否 | 简单、稳健、全局 | 函数评估次数多,效率低 | 粗搜索、全局探索 |
2️⃣ 三分搜索 (Ternary Search) | ❌ | ✅ | 实现简单、收敛性好 | 每次需两次函数计算,略慢于黄金分割 | 竞赛、数学优化 |
3️⃣ 黄金分割搜索 (Golden-section Search) | ❌ | ✅ | 函数评估最少、线性收敛 | 只能用于单峰 | 黑盒优化、工程试验 |
4️⃣ 牛顿法 (Newton’s Method) | ✅(一阶和二阶) | ❌ | 收敛快(平方收敛) | 需可导、易震荡、不全局 | 平滑函数精确最小化 |
5️⃣ 割线法 (Secant / Quasi-Newton) | ✅(近似导数) | ❌ | 比牛顿稳健、仍快 | 仍需平滑性 | 无显式导数时的快速法 |
🔍 详细介绍与对比
① 网格搜索 (Grid Search)
思想:
把区间 [a,b] 均匀划分成 n 个点,计算每个点的 f(x),取最小值点。
然后可在该点附近再细化。
优点:
- 不需要任何假设(可多峰、不连续、带噪声)。
- 保证找到全局最小值的近似(只要网格够密)。
缺点:
- 函数评估次数非常多。
- 精度和计算量呈线性关系。
适用场景:
函数复杂、非单峰、但区间有限,且函数调用不贵。
② 三分搜索 (Ternary Search)
前提: (f(x)) 单峰(unimodal)。
核心思想:
每次在 [a,b] 之间取两个内部点 (m_1, m_2):
- 若 (f(m_1)<f(m_2)),说明最小点在左边;
- 否则在右边。
每次缩小区间到 2/3。
优点:
- 简单,不需要导数。
- 收敛速度稳定。
缺点:
- 每次需要两次函数评估。
- 收敛率稍慢于黄金分割。
复杂度:
③ 黄金分割搜索 (Golden-section Search)
改进点:
在三分搜索的基础上使用最优比例
以便在每步缩减时能重用上一步的一个点,只计算 1 个新函数值。
优点:
- 无导数,最优利用函数值,评估次数最少。
- 数值稳定,简单易实现。
- 对非光滑函数鲁棒。
缺点:
- 必须单峰。
- 线性收敛(速度比牛顿慢)。
适用:
一维黑盒最优化的标准算法。
④ 牛顿法 (Newton’s Method)
前提: (f(x)) 连续可导且二阶可导。
更新公式:
优点:
- 收敛快(平方收敛)。
- 对平滑凸函数非常高效。
缺点:
- 需要计算一阶、二阶导数。
- 若初始点远离极小值,可能发散或跳错方向。
适用:
平滑凸函数(例如二次函数、对数似然函数等)。
⑤ 割线法 (Secant Method / Quasi-Newton)
思想:
用差分近似二阶导数,不显式计算 (f''(x))。
优点:
- 不需要二阶导。
- 收敛比线性快(约 1.618 阶)。
缺点:
- 仍需一阶导(或有限差分近似)。
- 对噪声、非光滑函数不稳。
适用:
有导函数但不易算二阶导时(数值优化常用)。
⚙️ 综合对比表
方法 | 单峰要求 | 需导数 | 函数调用数 | 收敛速率 | 全局性 | 实现难度 |
网格搜索 | ❌ | ❌ | 高 | 慢 | ✅ | ★ |
三分搜索 | ✅ | ❌ | 中(2/步) | 线性 | ❌ | ★ |
黄金分割搜索 | ✅ | ❌ | 最低(1/步) | 线性 | ❌ | ★ |
牛顿法 | ❌ | ✅ (一/二阶) | 少 | 超线性 | ❌ | ★★★ |
割线法 | ❌ | ✅ (一阶近似) | 少 | 超线性 | ❌ | ★★ |
💡 简要建议
场景 | 推荐算法 |
只知道函数值(黑盒、实验数据) | 黄金分割搜索 |
函数平滑、可导 | 牛顿法 / 割线法 |
函数多峰或不规则 | 网格搜索 / 多起点策略 |
只想快速近似单峰最小点 | 三分搜索(简单好写) |
📘 一句话总结
黄金分割搜索在“无导数 + 单峰 + 黑盒”场景下最优;牛顿法在“可导 + 局部凸”场景下最快;网格搜索在“多峰 + 无假设”场景下最稳;三分搜索是黄金分割的简洁变体;割线法是牛顿法的实用近似。
是否希望我接下来用一张图表+Python示例直观展示这几种搜索方法的收敛路径对比?(比如同一个目标函数、起点不同)