如何将数学函数拟合到 Python 中的数据集

How to fit math function to the dataset in Python

我有如下三组数据:

我想知道它们遵循的函数是什么以及如何在 Python 中拟合这些曲线?

我猜第一个函数是这样的:

y = axb + cx + d

我尝试了一些任意参数:

x = numpy.arange(1,10000,2.)
a = 100.
b = -0.003 
c = 50.
d = 0.1
y = -a/x**d+b*x+c
scatter(x,y)

如图所示:

有人可以帮忙解决另外两个问题吗?

scipy中有一个函数可用于将函数拟合到数据:scipy.optimize.curve_fit

感谢您的帮助。我从朋友那里得到了解决方案。

y = -a/x**d+b*x+c

由于d使拟合变得复杂,将d从0.1设置为1.0会更容易,然后使用curve_fit来拟合模型。最终找到最佳参数集。

赞赏!

作为 NumPy 和 SciPy:

的初学者,这就是我解决这个问题的方法

首先,创建一个 Python 函数,我们认为它为每个 x 计算 y。 (这个等式在上面的问题中。)

def fx(x, a, b, c, d):
    return -a / x**d + b*x + c

然后我们需要图表中的一些数据,这些数据没有包含在问题中,所以我猜了一下,使用问题中的绿色图表:

x = [0.01, 1000, 2000, 4000, 6000, 8000, 10000]
y = [1, 1.67, 1.75, 1.67, 1.6, 1.5, 1.4]

(x = 0 是无效点,因为 0**d 是 0,我们不能除以零。这就是为什么我说“0.01”。)

然后我们让SciPy计算常数应该是什么:

from scipy.optimize import curve_fit

popt, pcov = curve_fit(fx, x, y)
print(popt)

这会导致“运行时错误:未找到最佳参数”。我们可以通过手动猜测 d:

的值来提供帮助
def fx(x, a, b, c):
    d = -0.1
    return -a / x**d + b*x + c

popt 变量将包含 abc 的值:

[-5.64063556e-01 -6.55610681e-05  6.41890483e-01]

像这样进行实验并尝试不同的值时,使用像 Desmos 这样的图形计算器会很有帮助。