与 excel 相比,python 中的曲线拟合(结果的方差)

问题描述 投票:0回答:1

我是 python 的新手,而我以前使用过 matlab。目前我正在尝试对半对数图进行指数曲线拟合。下面是我目前得到的代码。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

time = np.array([0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260])

absorbance = np.array([0.02, 0.02, 0.042, 0.049, 0.094, 0.130, 0.160, 0.159, 0.205, 0.290, 0.440, 0.490, 0.310, 0.317])


def expf(x, a, b):
    return a * np.exp(b*x)


popt, pcov = curve_fit(expf, time, absorbance, p0=[0.02,0.0141], sigma=np.sqrt(absorbance))
a = popt[0]
b = popt[1]

plt.scatter(time, absorbance, label='data')
plt.plot(time, expf(time, a, b), 'r-', label='exponential fit')
plt.yscale('log')
plt.legend()
plt.show()


# r2 value
y_pred = expf(time, a, b)
SS_res = np.sum((absorbance - y_pred)**2)
SS_tot = np.sum((absorbance - np.mean(absorbance))**2)
r2 = 1 - (SS_res / SS_tot)
print("a =", a, "and b =", b)
print("R-squared value:", '{:.4}'.format(r2))

给予

a = 0.0368729243337103 and b = 0.009635937402567983
R-squared value: 0.6657

但是,在具有相同数据的 Excel 中,我发现 a、b 和 r2 值不同。我不确定为什么以及它是做什么的。我可以在 excel 中输入来自 python 的 b 值并得到相同的值,但我想知道为什么它的不同。重要吗? python 只是使用比 excel 更多的数字吗?提前致谢。

我试过对 python 结果进行加权,但由于 excel 也未加权,我认为 python 不应该也是如此。

python excel curve-fitting exponential
1个回答
0
投票

scipy.optimize.curve_fit
使用数值算法尝试找到最适合任意函数的近似值,但不能保证返回最优解。

我猜你在 Excel 中对指数函数

y = a*exp(b*x)
使用了曲线拟合。对于这种特定类型的函数,可以通过对给出
log y = b*x + log a
的等式两边应用对数来计算最优解。这将
log y
表示为
x
的线性函数。然后我们可以使用通常的最小二乘法求解
log a
b
,然后从
a
计算
log a

这里是如何使用

numpy
实现这个过程:

import numpy as np

time = np.array([0, 20, 40, 60, 80, 100, 120, 
                 140, 160, 180, 200, 220, 240, 260])

absorbance = np.array([0.02, 0.02, 0.042, 0.049, 0.094, 0.130, 0.160, 
                       0.159, 0.205, 0.290, 0.440, 0.490, 0.310, 0.317])

b, log_a =  np.linalg.lstsq(np.c_[time, np.ones_like(time)], 
                            np.log(absorbance), 
                            rcond=None)[0]
a = np.exp(log_a)

print(f"{b=}\n{a=}")

它给出:

b=0.012147124659447353
a=0.02641989005087254
© www.soinside.com 2019 - 2024. All rights reserved.