二维最小二乘拟合

1 投票
2 回答
3405 浏览
提问于 2025-04-17 14:57

我有一个二维的数据集,尺寸是固定的(xLenyLen),里面包含了一条正弦曲线。

我已经确定了这条正弦曲线的频率,并且用这个频率生成了自己的正弦数据,代码如下:

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

这里的 freqXfreqY 是曲线在X和Y方向上的振荡频率。

现在我想做一个线性最小二乘拟合(或者类似的东西),这样我就可以找到正确的振幅。根据我的了解,线性最小二乘法是个不错的选择,但如果有其他方法也可以。

不过,SciPy里的 leastsq 函数并不支持多维拟合。有没有Python实现的二维或多维最小二乘拟合算法呢?

编辑:我通过二维快速傅里叶变换(FFT)找到了正弦波的二维频率。我的数据包含了一条二维正弦波加上一些噪声,所以我只选取了二维FFT中最大的峰值,并对其进行了反变换。现在我得到了一个正弦曲线,但振幅不太对。有没有办法进行二维最小二乘拟合(或类似的方法),来调整振幅呢?

2 个回答

0

在最小二乘法拟合中,我们的目标是最小化一个残差函数,可能是卡方(chi-square)。这个过程涉及到对每个数据点的模型值和实际数据值之间的差的平方进行求和。在计算残差时,维度的信息会被“忽略”。所以,所有在二维差异函数数组中的值都可以被复制到一个一维数组中,这样就得到了残差函数的结果,可以传递给比如说 leastsq 这样的函数。我的回答中有一个例子,讲的是如何将复杂数转换为实数,而不是从二维转换为一维,链接在这里:最小二乘法最小化复杂数

0

如果你的数据适合用三角函数来处理,你可以考虑使用二维的有限/离散傅里叶变换(FFT/DFT)。

NumPy里面有一个内置的DFT解决方案。

有很多地方可以帮助你入门;谷歌找到的这个链接很不错。

从你的原始数据开始。这个变换可以告诉你你的频率解决方案是否正确,以及是否还有其他重要的频率。

撰写回答