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

使用curve_fit拟合柯西分布出现水平线问题求助

柯西分布拟合问题解决方法

问题根源

你的代码存在两个核心问题:

  1. 柯西PDF未适配数据量级:scipy自带的cauchy.pdf()输出值域在0~0.3左右(scale=1时),但你的灰度值是0-255级别的,直接拟合会因量级不匹配,被优化器压成水平线。
  2. 缺少合理初始猜测:curve_fit默认初始值全为1,和数据真实参数差距过大,导致拟合收敛到错误解。

修正后的代码

from scipy.stats import cauchy
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import pandas as pd

# 新增幅值参数A,匹配灰度值的量级
def cauchy_pdf(x, A, loc, scale):
    return A * cauchy.pdf(x, loc, scale)

# 读取数据
data = pd.read_csv('../camera_array_1.csv')
x = data['Distance_pixels'].values
y = data['Gray_Value'].values

# 生成合理的初始猜测值:
# A取灰度值最大值,loc取灰度峰值对应的x,scale取x范围的1/10
peak_idx = y.argmax()
p0 = [y.max(), x[peak_idx], (x.max() - x.min())/10]

# 执行拟合,传入初始猜测
popt, pcov = curve_fit(cauchy_pdf, x, y, p0=p0)

A_fit, loc_fit, scale_fit = popt

# 排序x值,让拟合曲线更平滑
sorted_idx = x.argsort()
x_sorted = x[sorted_idx]
y_fit = cauchy_pdf(x_sorted, *popt)

# 绘图展示
plt.scatter(x, y, label='原始数据', s=5)
plt.plot(x_sorted, y_fit, 'r-', label=f'拟合柯西分布\nA={A_fit:.1f}, loc={loc_fit:.1f}, scale={scale_fit:.1f}')
plt.xlabel('Distance_pixels')
plt.ylabel('Gray_Value')
plt.legend()
plt.show()

关键修改说明

  • 新增A参数:用来缩放柯西PDF的高度,适配灰度值的量级范围。
  • 手动设置初始猜测p0:让优化器从接近真实值的位置开始搜索,避免收敛到局部最优解。
  • 排序x值:原始数据的x可能无序,排序后绘制的拟合曲线会连续平滑,更直观展示拟合效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:50:16