gpt4 book ai didi

python - 基于点创建平滑线

转载 作者:行者123 更新时间:2023-11-30 22:28:52 28 4
gpt4 key购买 nike

我有以下数据集:

x = [1, 6, 11, 21, 101]
y = [5, 4, 3, 2, 1]

我的目标是创建一条如下所示的平滑曲线: enter image description here

有没有办法在Python中做到这一点?

我尝试使用 here 中所示的方法,这是代码:

from scipy.interpolate import spline

import matplotlib.pyplot as plt
import numpy as np

x = [1, 6, 11, 21, 101]
y = [5, 4, 3, 2, 1]

xnew = np.linspace(min(x), max(x), 100)

y_smooth = spline(x, y, xnew)

plt.plot(xnew, y_smooth)
plt.show()

但是输出显示了一条奇怪的线。 enter image description here

最佳答案

首先,interpolate.spline() has been deprecated ,所以你可能不应该使用它。而是使用 interpolate.splrep()interpolate.splev() 。这不是一个困难的转换:

y_smooth = interpolate.spline(x, y, xnew)

变成了

tck = interpolate.splrep(x, y)
y_smooth = interpolate.splev(xnew, tck)

但是,这并不是真正的问题。默认情况下,scipy 尝试将 3 次多项式拟合到您的数据,但这并不真正适合您的数据。但由于点很少,即使它是一个非直观的近似值,它也可以很好地拟合您的数据。您可以设置多项式的次数,使其尝试与splrep()k=...参数相匹配。但即使对于 2 次多项式也是如此;它正在尝试拟合抛物线,并且您的数据可能会拟合中间有弓的抛物线(这就是它现在所做的,因为斜率在开始时非常陡并且中间没有数据点)。

就您而言,您的数据更准确地表示为指数,因此最好拟合指数。我建议使用 scipy.optimize.curve_fit() 。它允许您指定您自己的包含参数的拟合函数,并且它将为您拟合参数:

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

x = [1, 6, 11, 21, 101]
y = [5, 4, 3, 2, 1]

xnew = np.linspace(min(x), max(x), 100)

def expfunc(x, a, b, c):
return a * np.exp(-b * x) + c

popt, pcov = curve_fit(expfunc, x, y)
plt.plot(xnew, expfunc(xnew, *popt))
plt.show()

Fitted plot

关于python - 基于点创建平滑线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46512872/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com