使用curve_fit拟合柯西分布出现水平线问题求助
柯西分布拟合问题解决方法
问题根源
你的代码存在两个核心问题:
- 柯西PDF未适配数据量级:scipy自带的
cauchy.pdf()输出值域在0~0.3左右(scale=1时),但你的灰度值是0-255级别的,直接拟合会因量级不匹配,被优化器压成水平线。 - 缺少合理初始猜测:
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
相关产品推荐
相关产品推荐

