【问题标题】:Fitting time series with Fourier components: estimating Fourier series coefficients用傅立叶分量拟合时间序列:估计傅立叶级数系数
【发布时间】:2016-03-25 11:53:03
【问题描述】:

问题:我有一组表现出周期性变化的测量值(时间、测量值、误差),我想用傅里叶级数形式对它们进行拟合

其中 A0 是我测量的平均值,t 是时间,t0 是(已知)参考时间,P 是(已知)周期。我想拟合系数 A_k 和 phi_k。

这是我目前得到的:

# Find Fourier components
# nfourier is the number of fourier components 

    def fourier(coeffs, time_data, epoch, period, nfourier, A0):
       import numpy as np
       omega = 2.0*np.pi/period
       fseries = np.zeros(len(time_data))
       fseries.fill(A0)
       for k in range(nfourier):
          ak = coeffs[k]
          phik = coeffs[k+1]
          time_diff = time_data - epoch
          fseries = fseries + ak * np.cos(k * omega * time_diff + phik)

       return fseries

我估计残差如下:

def residuals(coeffs, measurement_data, time_data, error_data, epoch, period, nfourier, A0):
   model = fourier(coeffs, time_data, epoch, period, nfourier, A0)
   result = measurement_data - model
   return result

然后我适合它:

def fit_it(coeffs, measurement_data, time_data, error_data, epoch, period, nfourier, A0):
   from scipy.optimize import leastsq
   opt_coeff = leastsq(residuals, coeffs, args=(measurement_data, time_data, error_data, epoch, period, nfourier, A0))
   return opt_coeff

程序成功完成,但拟合似乎失败,如下图所示:

我不确定我在这里做错了什么,但也许专家可以提供一些建议。如果有人愿意提供帮助,我很乐意提供测试数据集。

【问题讨论】:

  • 为什么不使用定义并通过对每个cos() 因子的缩放数据进行平均来估计系数?应该更简单。很难理解你使用的代码
  • 嗨 Niko,你能给我举个例子来说明你的意思吗?我的数据只是一个时间序列,我将一些固定参数(epoch、period、nfourier、A0)作为函数之间的参数传递。该函数在fourier() 中定义,fit_it() 最小化(或至少应该)残差。它只是线性最小二乘拟合。
  • 好的,我指的是fourier coeficients的实际定义,但是无论如何,仍然不太了解代码,例如epoch是如何相关的,或者其他一些参数?
  • 基于我在原帖中给出的公式:coeffs - 这些是 A_k、phi_k 系数。测量数据 - 这些是我的 y 轴值。 time_data - x 轴值 (t) error_data - 测量数据中每个点的不确定性 epoch - 已知参考时间 (t0) period - 已知周期 (P) nfourier - 要拟合的傅立叶参数数量(例如 9) A0 - mean(measurement_data) 这有意义吗?
  • 使用最小二乘法作为近似值是一种方法,但是请注意,最小二乘法将尝试找到全局近似值。这意味着,例如通过更改 nfourier 参数,例如,从 2 到 3 并进行最小二乘,nfourier3 的前 2 个系数将不匹配 nfourier2 的前 2 个系数(虽然这些应该匹配)。如果到目前为止我还没有正确理解代码

标签: python scipy time-series fft model-fitting


【解决方案1】:

如果您知道数据的周期,您应该对 x 轴进行相位折叠。看起来 x 轴是在儒略日。您应该在测量期间计算相位

阶段 = ((时间 - 参考时间) % 期间) / 期间

您需要将傅立叶级数拟合到测量与相位图上,这看起来更像是一个周期性信号。

【讨论】:

    【解决方案2】:

    我不明白傅立叶拟合背后的原因。我想您想知道数据的调制频率分量。我建议您每次都取数据的平均值并取其平均值,这将使您对数据的频谱有更多的了解。

    就您的代码而言,我想制作两个 cmets。首先,第 k 个元素的相位是第 k+1 个元素的幅度。其次,error_data 没有从函数残差中获取任何信息。您可以检查这些要点。

    这更像是评论,但我没有足够的声誉发表评论。只是想帮忙。

    问候

    【讨论】:

    • 您好 hsinghal,感谢 cmets。我将需要修改代码并在考虑到它们之后查看它的执行情况。至于您评论的第一部分,我需要傅立叶系数来计算其他一些参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多