You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定位热力图对应二维数据的局部最小值点?

基于插值热力图数据检测局部最小值的可行实现方法

问题原因分析

你之前用np.gradient找局部最小值失败,核心是两个问题:

  • 混淆了极值导数判定规则:局部最小值需要一阶导数接近0,且Hessian矩阵正定(二阶导数xx>0、二阶导数yy>0,且二阶导数行列式大于0),而非二阶导数为负(那是局部最大值的判定条件)
  • 忽略数值插值精度:插值后的网格数据一阶导数不会严格等于0,必须用阈值判断"接近0"

完整实现代码

结合你已有的热力图绘制流程,完整实现如下:

1. 模拟数据生成(用于测试)

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

# 生成含多个局部最小值的模拟数据
np.random.seed(42)
n_points = 200
x = np.random.uniform(0, 360, n_points)
y = np.random.uniform(0, 360, n_points)
# 构造带多最小值的目标函数
f = np.sin(np.radians(x))**2 + np.cos(np.radians(y))**2 + 0.5*np.sin(np.radians(x+y))
# 保存为data.dat文件
np.savetxt("data.dat", np.column_stack((x, y, f)), fmt="%.6f")

2. 读取数据并生成插值网格

# 读取data.dat数据
data = np.loadtxt("data.dat")
x_raw, y_raw, f_raw = data[:,0], data[:,1], data[:,2]

# 生成均匀插值网格
xi = np.linspace(x_raw.min(), x_raw.max(), 200)
yi = np.linspace(y_raw.min(), y_raw.max(), 200)
xi, yi = np.meshgrid(xi, yi)

# 线性插值生成连续网格数据zi
zi = griddata((x_raw, y_raw), f_raw, (xi, yi), method='linear')

3. 计算梯度并筛选局部最小值

# 计算一阶导数
dx, dy = np.gradient(zi)
# 计算二阶导数(Hessian矩阵元素)
dxx, dxy = np.gradient(dx)
dyx, dyy = np.gradient(dy)

# 设置数值阈值(根据插值精度调整)
grad_threshold = 1e-5
hessian_det_threshold = 1e-8

# 筛选满足局部最小值条件的点:
# 1. 一阶导数绝对值小于阈值(接近0)
# 2. 二阶导数xx、yy均大于0
# 3. Hessian行列式大于0(排除鞍点)
min_mask = (np.abs(dx) < grad_threshold) & (np.abs(dy) < grad_threshold) & \
           (dxx > 0) & (dyy > 0) & (dxx*dyy - dxy**2 > hessian_det_threshold)

# 提取局部最小值的坐标和对应函数值
min_x = xi[min_mask]
min_y = yi[min_mask]
min_f = zi[min_mask]

4. 可视化热力图与局部最小值

plt.figure(figsize=(10,8))
# 绘制热力图
contour = plt.contourf(xi, yi, zi, cmap='viridis', levels=50)
plt.colorbar(contour, label='f(x,y)')
# 标记局部最小值点
plt.scatter(min_x, min_y, color='red', s=50, marker='*', label='局部最小值')
plt.xlabel('X (角度)')
plt.ylabel('Y (角度)')
plt.title('热力图与局部最小值检测')
plt.legend()
plt.show()

# 输出检测结果
print("检测到的局部最小值:")
for x_val, y_val, f_val in zip(min_x, min_y, min_f):
    print(f"X: {x_val:.2f}°, Y: {y_val:.2f}°, f(x,y): {f_val:.4f}")

关键注意事项

  • 阈值调整:grad_threshold和hessian_det_threshold需根据你的插值精度灵活调整,数值越小筛选越严格
  • 插值方法:如果线性插值的平滑度不足,可替换为method='cubic',能得到更连续的梯度结果
  • 坐标转换:若需基于弧度计算梯度,只需将xi和yi转换为弧度后再执行梯度计算即可

内容的提问来源于stack exchange,提问作者Pedro Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:20:28