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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:15:02