【问题标题】:Two dimensional least squares fitting二维最小二乘拟合
【发布时间】:2013-01-21 15:28:54
【问题描述】:

我有一个二维数据集,有一些固定维度(xLen 和yLen),其中包含一条正弦曲线。

我已经确定了正弦曲线的频率,并使用频率生成了我自己的正弦数据

SineData = math.sin((2*math.pi*freqX)/xLen + (2*math.pi*freqY)/yLen)

其中freqX 和freqY 以及曲线在X 和Y 方向的振荡频率。

但现在我想做一个线性最小二乘拟合(或类似的东西),这样我就可以拟合正确的幅度。据我所知,线性最小二乘法是正确的方法,但如果有其他方法也可以。

leastsq 函数是 SciPy 不进行多维拟合。是否有用于 2/多维最小二乘拟合算法的 python 实现

编辑:我从二维 FFT 中找到了正弦波的二维频率。数据包含 2D 正弦 + 噪声,所以我只选择了 2D FFT 的最大峰值并取其倒数。现在我有一条正弦曲线,但幅度是关闭的。有没有办法做一个二维最小二乘(或类似的),并拟合幅度?

【问题讨论】:

    标签: python curve-fitting least-squares


    【解决方案1】:

    如果使用三角函数可以很好地处理您的数据,您也可以考虑使用二维有限/离散傅里叶变换 (FFT/DFT)。

    NumPy 内置了 DFT 解决方案。

    有很多地方可以帮助您入门;谷歌找到了this one。

    从您的原始数据开始。变换会告诉您您的频率解是否正确以及是否还有其他重要的频率。

    【讨论】:

    • 2D FFT 是我找出正确频率的方法……但幅度已关闭。我也试图弄清楚如何获得正确的幅度,NumPy 缩放并没有给我正确的幅度。
    • 当您说振幅关闭时,我不确定我是否理解您的意思。 FFT 会将您的 2D 空间数据转换为幅度/频率对。你没有得到一个幅度;你得到一个与每个频率相关的。您可能会说您通过仅选择一个频率隐式使用了低通滤波器,因此计算出的幅度不匹配。我建议通过转换,应用过滤器,然后再转换回来看看你得到什么,来更正式地了解它。这就是您应该与数据进行比较的函数。
    • 不,这正是我的意思。我对原始信号做了FFT,取最大峰值对应的频率作为二维信号的频率。然后我将所有其他点(除了对应于最大峰值的点)设置为零,并进行 IFFT。幅度仍然关闭,因此我正在尝试找到一种使幅度适合原始信号的方法。
    • 应该有两个频率 - 一个用于 x,另一个用于 y。物理学会告诉你,两者的基本原理分别是 2*pi/Lx 和 2*pi/Ly。我不知道你的边界条件是什么,但如果边界上的 x = y = 0 你会有两个正弦波。
    • 好的,我想我在试图解释事情时一直很困惑。频率很好...我有正确的二维频率,一个用于 X,另一个用于 Y,以及每个方向的尺寸。所以波浪本身不是问题。只是IFFT波的幅度(这是我的正弦波,我从中找到每个方向的频率)比初始曲线小得多。我只想使用一些拟合算法来拟合幅度,因为频率本身很好。
    【解决方案2】:

    在最小二乘拟合中,最小化残差函数,也许是卡方。由于这涉及对与模型减去数据的每个点的差平方相对应的估计求和,因此在制作残差时“忘记”了维数。因此,作为提供给例如leastsq 的残差函数的结果,可以将 2D 差分函数数组中的所有值复制到 1D 数组。在我对这个问题的回答中给出了一个复杂到真实而不是 2D 到 1D 的示例:Least Squares Minimization Complex Numbers

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-24
      • 2012-08-29
      • 2014-03-05
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      相关资源
      最近更新 更多