【问题标题】:Python - curve fit producing incorrect fitPython - 曲线拟合产生不正确的拟合
【发布时间】:2017-02-11 07:56:06
【问题描述】:

我正在尝试将此数据分布拟合为正弦波曲线,但由于某种原因,拟合不正确:

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





#=======================
#====== Analysis =======
#=======================

# sine curve fit
def fit_Sin(t, A, b, C):
    return A* np.sin(t*b) + C

## The Data extraciton
t,y,y1 = np.loadtxt("new10_CoCore_5to20_BL.txt", unpack=True)

xdata = t
popt, pcov = curve_fit(fit_Sin, t, y)
print "A = %s , b = %s, C = %s" % (popt[0], popt[1], popt[2])



#=======================
#====== Plotting =======
#=======================

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)

ax1.plot(t, y, ".")
ax1.plot(t, fit_Sin(t, *popt))


plt.show()

这种拟合极大地低估了数据。任何想法为什么会这样?

这是此处提供的数据:https://www.dropbox.com/sh/72jnpkkk0jf3sjg/AAAb17JSPbqhQOWnI68xK7sMa?dl=0

知道为什么会这样吗?

【问题讨论】:

    标签: python numpy scipy curve-fitting


    【解决方案1】:

    如果您的频率猜测不正确,正弦波将极难拟合。这是因为在数据中有足够数量的周期时,即使频率出现很小的误差,猜测也会与一半数据异相,与一半数据同相。在这一点上,直线比不同频率的正弦波更适合。顺便说一下,这就是傅立叶变换的工作原理。

    我可以想到三种方法来很好地估计频率以允许非线性最小二乘算法接管:

    1. 关注它。在 GUI 甚至命令行中减去两个峰值的 x 值。如果您有非常低的噪声数据,您可以很容易地自动化这个过程。
    2. 使用离散傅里叶变换。如果您的数据是一个分量的正弦波,则第一个非恒定峰值将为您提供频率。我发现这需要一些额外的调整,因为采样的频率通常不是正弦波频率的倍数。在这种情况下,对峰值周围的三个点(包括峰值在内的三个点)进行抛物线拟合会有所帮助。
    3. 查找数据与垂直偏移的交叉位置。这类似于#1,但对于相对无噪声的数据更容易自动化。波长是一对交叉点之间距离的两倍。

    使用 #1,我可以清楚地看到您的波长是 50。因此,b 的初始猜测应该是 2*np.pi/50。另外,不要忘记添加相移参数以允许拟合水平滑动:A*sin(b*t + d) + C

    您需要通过p0 参数将初始猜测传递给curve_fit。一个好的眼球估计是p0=(0.55, np.pi/25, 0.0, -np.pi/25*12.5)。您的数据中的相移似乎是右侧的四分之一周期,因此是 12.5。

    我目前正在编写一个算法,用于拟合具有单一频率分量的嘈杂正弦波,我将提交给 SciPy。完成后会更新。

    【讨论】:

    • 我在使用遗传算法提供初始参数估计方面取得了一些成功,但我的经验是,您的 #1 建议似乎效果最好。请注意,此处“C”的初始参数估计只是数据的平均值。
    • @JamesPhillips。对于足够复杂的数据(我实际上已经看过示例),最好先估计幅度,然后取峰之间距离的一半。但老实说,除了频率,相移是唯一一个偶尔需要超过 2 或 3 次 curve_fit 迭代才能确定的参数。
    • 我的计划是做一个简化的 KDE 以获得比 FFT 更可靠的频率
    猜你喜欢
    • 2015-03-02
    • 2018-04-27
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2021-02-16
    • 2021-03-21
    • 1970-01-01
    相关资源
    最近更新 更多