使用matplotlib绘制散点图后如何获取指数型最佳拟合函数
Python指数分布散点数据拟合可行方案
方案1:使用scipy.optimize.curve_fit做非线性最小二乘拟合(推荐,精度最高)
这是最通用的非线性拟合方案,直接基于原始数据做最小二乘优化,不需要对数据做变换,适配几乎所有指数模型形式,得到的是全局最优参数。
操作逻辑:
- 自定义你的指数函数形式,常用基础形式为
y = a * np.exp(b * x) + c,无截距场景可简化为y = a * np.exp(b * x) - 传入x、y原始数据调用拟合接口,直接得到最优参数
示例代码片段:
import numpy as np from scipy.optimize import curve_fit # 自定义指数模型,可根据你的数据特征调整形式 def exp_func(x, a, b, c): return a * np.exp(b * x) + c # x_data、y_data为你的原始散点数据 popt, _ = curve_fit(exp_func, x_data, y_data) # popt依次存储a、b、c的最优拟合参数,直接代入exp_func即可得到拟合函数 a, b, c = popt
方案2:对数变换后做线性回归(轻量简化方案)
如果你的数据符合无截距的基础指数模型y = a * np.exp(b * x),且所有y值均为正数,可以通过对数变换将非线性关系转为线性关系,用普通线性回归拟合后再还原参数:
- 对等式两边同时取自然对数,得到
ln(y) = ln(a) + b * x - 以x为自变量、
ln(y)为因变量做线性回归,得到的斜率为b,截距为ln(a),取指数后得到a
注意:该方案仅适用于误差服从对数正态分布的场景,若原始数据误差为正态分布,拟合得到的参数不是全局最优,精度低于方案1。
方案3:使用numpy.polyfit拟合
和方案2逻辑一致,仅调用接口不同,直接对变换后的ln(y)做1次多项式拟合即可:
# 仅适用于无截距的基础指数模型,且y_data所有值为正 log_y = np.log(y_data) z = np.polyfit(x_data, log_y, 1) b = z[0] a = np.exp(z[1])
拟合注意事项
- 拟合前建议先清洗异常值,异常值对指数拟合的影响远高于线性拟合
- 如果单指数模型拟合效果差,可调整函数形式,比如增加常数项、使用双指数模型
y = a * np.exp(b * x) + c * np.exp(d * x)适配更复杂的分布 - 可通过计算拟合结果的R²、残差平方和评估拟合效果,选择最优的模型形式
内容的提问来源于stack exchange,提问作者Neetu
相关产品推荐
相关产品推荐

