在数据集中查找曲线

时间:2012-08-01 06:52:40

标签: math computer-science

假设我有一个数据集,其中包含函数的x y值,例如sin(x)和范围。如何检测此数据集中的曲线(sin函数的峰值和波谷)?

5 个答案:

答案 0 :(得分:2)

给定一组足够大的(x,y)坐标,你可以适应你喜欢的任何函数,正弦函数,高(或低)度多项式,线性,指数,样条,任何东西一点都不得到一个合适的部分是非常棘手的。

在开始寻找数据之前,您应该真正了解数据应该适合的功能类型。例如,如果您的数据来自循环过程,您认为该循环过程具有稳定幅度的恒定周期,请尝试为其安装单个正弦函数。 (如果这是你想要做的,请按照@ duyffmo的建议。)

在您的一条评论中,您提示数据是随机的。如果是这种情况,不要浪费时间尝试拟合曲线,术语random的一个很好的定义是没有能够生成真正随机数据系列的函数。如果你的意思是“有正弦的,幅度和相位随机变化”,这就是拟合优度度量,它们量化你的模型(即你选择的函数)和数据之间的差异你加入了这个过程。

答案 1 :(得分:1)

您可以尝试使用强力方法并使用搜索算法来定位最小值和最大值。

另一种选择是将最小二乘多项式拟合到数据中,并通过导数从近似中找到局部最大值和最小值。这有点冒险,除非你的近似非常合适。

如果您的数据非常振荡,您可以尝试使用样条线逼近。

没有看到数据,很难说。如果您的数据有噪声,那么使用有限差分方法计算导数是有风险的,因为导数方法对噪声非常敏感。

我想说使用最小二乘样条近似可以获得最大的灵活性。这将使您能够处理非常广泛的数据输入。除非你能掌握数值线性代数库,否则它在世界上实现并不是最简单的事情,但它可能会给你带来最好的结果。

答案 2 :(得分:1)

如果您有(x,y)数据,并且您确定需要三角函数,那么最好的办法是进行快速傅里叶变换。您将获得数据中存在的所有频率。您将能够看到哪些具有最大幅度并主导您的信号。您可以对其进行过滤以删除您不感兴趣的频率。有大量的文献和软件可以帮助您。如果您愿意,甚至可以使用CUDA和GPU - 内置FFT包。

答案 3 :(得分:0)

如果您对建模的功能一无所知,只想找到转折点,您可以区分曲线并找出它过零的位置。

近似离散数据集导数的一种方法是对每对相邻点取(y2-y1)/(x2-x1)。您可以遍历数据点并记录其从正值变为负值的位置,反之亦然。

答案 4 :(得分:0)

我昨天想出的一个解决方案:在数据上使用滑动窗口(我使用数据集大小的第五个),并投票选择局部最小值和最大值,当窗口滑过数据时,投票率最高成为曲线的中心。为了进一步处理,一旦我得到这些数据,我会将点阈值降低到几个强点,然后执行多项式回归(到3度),取一个值(在ax ^ 2 + bx + c)到确定曲线的大小(如果它太平,那么只考虑它是一个带有异常的直线)。

我想补充一点,我可能没有准确描述问题,当我说sin(x)我正在使用生成曲线的例子时,我的数据绝不会遵循三角函数(或任何函数) ,曲线将在随机位置,使回归不准确。

这可能不是完美的解决方案,但确实有效。