JZYGNTR 2022-07-18 12:33 采纳率: 75%
浏览 77
已结题

y=a*exp(b*x)这个式子怎么在python中作为条件编写(使用最小二乘法拟合的参数估计程序)

问题遇到的现象和发生背景

y=aexp(bx)这个式子怎么在python中作为条件编写,这是一个使用最小二乘法拟合的参数估计程序。

问题相关代码,请勿粘贴截图
import numpy as np
import matplotlib.pylab as plt
import statsmodels.api as sm
import math

exp=np.loadtxt('5.dat',delimiter=',')

n=len(exp[:,0])
ave_x=np.average(exp[:,0])
ave_y=np.average(exp[:,1])

Sxx=np.sum((exp[:,0]-ave_x)*(exp[:,0]-ave_x))/n
Syy=np.sum((exp[:,1]-ave_y)*(exp[:,1]-ave_y))/n
Sxy=np.sum((exp[:,0]-ave_x)*(exp[:,1]-ave_y))/n

S=np.cov(exp,rowvar=False, bias=True)

print(Sxx,S[0,0])
print(Syy,S[1,1])
print(Sxy,S[0,1])

b=Sxy/Sxx
a=ave_y-b*ave_x

x=np.sort(exp[:,0])
y=a*exp(b*x) #这里出错了

plt.plot(exp[:,0],exp[:,1],linestyle='None',marker='x')
plt.plot(x,y,color='r')
plt.show()

res_exp=Syy*n
res_model=np.sum((y-ave_y)*(y-ave_y))
R2=res_model/res_exp

sigma_y=np.sqrt(np.sum((exp[:,1]-a-b*exp[:,0])*(exp[:,1]-a-b*exp[:,0]))/(n-2))
sigma_b=sigma_y/np.sqrt(n*Sxx)
sigma_a=sigma_y*np.sqrt((ave_x*ave_x+Sxx)/(n*Sxx))

print(sigma_a,sigma_b)

x_add_const=sm.add_constant(exp[:,0])
result=sm.OLS(exp[:,1],x_add_const).fit()

print(result.summary())

print('Parameters: ',result.params)
print('Standard error: ',result.bse)
print('Coefficient of determination ',result.rsquared)

y=result.params[0]+result.params[1]*x
plt.plot(exp[:,0],exp[:,1],linestyle='None',marker='x')
plt.plot(x,y,color='r')
plt.show()

运行结果及报错内容

Traceback (most recent call last):
File "E:/python practice/555/5-1.py", line 26, in
y=aexp(bx)
TypeError: 'numpy.ndarray' object is not callable

我的解答思路和尝试过的方法

是否要化成这样来写程序?
ln(𝑦) = ln(𝑎exp 𝑏𝑥 )
ln 𝑦 = ln 𝑎 + ln exp 𝑏𝑥 = ln 𝑎 + 𝑏𝑥
𝑦́ = 𝑎́ + 𝑏𝑥
𝑎 ± 𝜎6 = exp 𝑎G± 𝜎6́ = exp 𝑎́ ± exp 𝑎́ 𝜎6

我想要达到的结果

我想要在y=aexp(bx)的条件下完成a、b误差的计算。

展开全部

  • 写回答

2条回答 默认 最新

  • 广大菜鸟 2022-07-18 12:51
    关注

    需要转化,拟合函数需要是线性的时候才可以使用最小二乘法

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    广大菜鸟 2022-07-18 13:10

    调包实现

    import numpy as np
    import scipy as sp
    from scipy.optimize import leastsq
    import matplotlib.pyplot as plt
    
    
    # 拟合 y = 2 * exp(3 * x)
    
    # 目标函数
    def real_func(x):
        return 2 * np.exp(3 * x)
    
    
    # 多项式
    # ps: numpy.poly1d([1,2,3])  生成  x^2+2x^1+3x^0
    def fit_func(p, x):
        f = np.poly1d(p)
        return f(x)
    
    
    # 残差
    def residuals_func(p, x, y):
        ret = fit_func(p, x) - np.log(y)
        return ret
    
    
    # 准备十个初始数据点
    x = np.linspace(0, 1, 10)
    y = real_func(x)
    
    # 细分数据点
    x_points = np.linspace(0, 1, 1000)
    
    
    def fitting(M=0):
        """
        n 为 多项式的次数
        """
        # 随机初始化多项式参数
        p_init = np.random.rand(M + 1)
        # 最小二乘法 The least square method
        p_lsq = leastsq(residuals_func, p_init, args=(x, y))
        print('Fitting Parameters:', p_lsq[0])
        print("a = ",  np.exp(p_lsq[0][1]))
        print("b = ", p_lsq[0][0])
    
        # 可视化
        plt.plot(x_points, real_func(x_points), label='real')
    
        plt.plot(x_points, np.exp(fit_func(p_lsq[0], x_points)), label='fitted curve')
        plt.plot(x, y, 'bo', label='noise')
        plt.legend()
        plt.show()
        return p_lsq
    
    
    if __name__ == '__main__':
        # M=0
        p_lsq_0 = fitting(M=1)
    
    
    

    img

    回复
    JZYGNTR 回复 广大菜鸟 2022-07-18 14:40

    非常感谢您,我将

    def real_func(x):
        return a*np.exp(b*x)
    def fit_func(p, x):
        f = np.poly1d(p)
        return f(x)
    def residuals_func(p, x, y):
        ret = fit_func(p, x) - np.log(y)
        return ret
    
    x=np.sort(exp[:,0])
    y = real_func(x)
    
    
    

    代码插入之后顺利运行并得到了所需结果。
    感谢指导。

    回复
    Bidaxxxx 回复 JZYGNTR 2022-10-25 01:41

    请问这里 a和b 没有定义啊?能直接用吗?
    我是想用y=ae*(bx) 拟合一组数据?求解答

    1
    回复
    展开全部6条评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月18日
  • 已采纳回答 7月18日
  • 创建了问题 7月18日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部