假设我有一个数据集,其中包含函数的 xy 值,例如 sin(x) 和一个范围。如何检测此数据集中的曲线(此中 sin 函数的波峰和波谷)?
5 回答
给定一组(x,y)
足够大的坐标,你可以拟合任何你喜欢的函数,一个正弦函数,一个高(或低)次多项式,线性,指数,样条曲线,任何东西。获得良好的身材是棘手的部分。
在开始寻找数据之前,您应该真正了解数据应该适合的函数类型。例如,如果您的数据来自您认为具有恒定周期且幅度稳定的循环过程,请尝试为其拟合单个正弦函数。(如果这是您想要做的,请遵循 @duyffmo 的建议。)
在您的一条评论中,您暗示数据是随机的。如果是这种情况,请不要浪费时间尝试拟合曲线,该术语的一个很好的定义random
是没有函数可以生成真正随机的数据序列。如果您的意思是类似于“幅度和相位随机变化的正弦曲线”,这就是拟合优度测量的用途,它们量化了您的模型(即您选择的函数)和数据之间的差异你进入这个过程。
您可以尝试蛮力方法并使用搜索算法来定位最小值和最大值。
另一种选择是将最小二乘多项式拟合到您的数据中,并通过导数从近似值中找到局部最大值和最小值。除非您的近似值非常合适,否则这有点冒险。
如果您的数据非常不稳定,您可以尝试使用样条曲线进行近似。
没有看到数据很难说。如果您的数据有噪声,那么使用有限差分方法计算导数是有风险的,因为导数方法对噪声非常敏感。
我会说你会使用最小二乘样条近似获得最大的灵活性。这将使您能够处理非常广泛的数据输入。除非您可以掌握数值线性代数库,否则这不是世界上最容易实现的事情,但它可能会为您带来最佳结果。
如果您有 (x, y) 数据,并且确定需要三角函数,那么最好的办法是进行快速傅立叶变换。您将获得数据中存在的所有频率。您将能够看到哪些信号幅度最大并主导您的信号。您可以对其进行过滤以删除您不感兴趣的频率。有大量的文献和软件可以帮助您。如果你愿意,你甚至可以使用 CUDA 和 GPU——有一个内置的 FFT 包。
如果您对正在建模的函数一无所知,只想找到转折点,则可以区分曲线并找到与零相交的位置。
逼近离散数据集导数的一种方法是获取(y2-y1)/(x2-x1)
每对相邻的点。您可以遍历数据点并记录从正值变为负值的位置,反之亦然。
我昨天想出的一个解决方案:在数据上使用滑动窗口(我使用数据集大小的 5 分之一),并为局部最小值和最大值投票,当窗口在数据上滑动时,最多的投票往往是曲线的中心。为了进一步处理,一旦我有了这些数据,我将对这些点设置阈值以将其稀释到几个强点,然后执行多项式回归(到 3 度),取 a 值(在 ax^2+bx+c 中)确定曲线的大小(如果它太平,那么只考虑它是一条异常的直线)。
我想补充一点,我可能没有准确地描述问题,当我说 sin(x) 时,我使用的是生成曲线的示例,我的数据绝不会遵循三角函数(或任何函数),并且曲线将在随机位置使回归不准确。
这可能不是完美的解决方案,但它确实有效。