带常数项指数函数的非线性回归方法(python实现)

        通常不带常数项的指数函数(y = b*e^{ax})可以通过两边取对数转化成线性函数u= sx+t,然后再通过最小二乘法拟合求解,但是带常数的指数函数是非线性的,所以该方法就失效了。所以只能用如下方法,以下方法是在一个国外的一个论坛上找到的,先求导,再进行线性回归。

 以下是python实现的代码

from cmath import exp
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize as op

# 需要拟合的数据组
x = np.array([0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12])
y = np.array([302.37, 276.29, 257.62, 242.03, 231.04, 215.03, 203.59, 195.18, 188.67, 178.68, 174.98, 169.79])

def regress_exponential_with_offset(x, y):
    # sort values
    ind = np.argsort(x)
    x = x[ind]
    y = y[ind]

    # decaying exponentials need special treatment
    # since we can't take the log of negative numbers.
    neg = -1 if y[0] > y[-1] else 1
    dx = np.diff(x)
    dy = np.diff(y)
    dy_dx = dy / dx

    # filter any remaining negative numbers.
    v = x[:-1]
    u = neg * dy_dx
    ind = np.where(u > 0)[0]
    v = v[ind]
    u = u[ind]

    # perform regression
    u = np.log(u)
    s, t = np.polyfit(v, u, 1)
    a = s
    b = neg * np.exp(t) / a
    yy = np.exp(a * x) * b
    c = np.median(y - yy)
    return a, b, c



# 得到返回的A,B值
t = regress_exponential_with_offset(x,y)
a = t[0]
b = t[1]
c = t[2]
print(a)
# 数据点与原先的进行画图比较
plt.scatter(x, y, marker='o',label='real')
x = np.arange(0, 0.15, 0.01)
y = b*np.exp(a*x) + c
plt.plot(x, y,color='red',label='curve_fit')
plt.legend()

plt.show()

拟合后的效果,如下图

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值