【问题标题】:Finding curves in a dataset在数据集中查找曲线
【发布时间】:2012-08-01 06:52:39
【问题描述】:

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

【问题讨论】:

  • 范围是什么意思?它总是以A * sin(b * x) 的形式出现吗?
  • 该图将从 x = 0 到 x = 50,引入许多曲线。形式是随机的,可以这么说,我想看看数据什么时候“反转”。
  • 我在这个项目中使用 C,但我认为任何类型的解决方案都可以用这种语言呈现。
  • 你能给我们展示示例数据吗?它可能有助于使您尝试做的事情更清晰。

标签: math computer-science


【解决方案1】:

给定一组足够大小的(x,y) 坐标,您可以拟合任何您喜欢的函数、正弦函数、高(或低)次多项式、线性、指数、样条曲线,任何东西.获得合适的身材是棘手的部分。

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

在您的一个 cmets 中,您暗示数据是随机的。如果是这种情况,请不要浪费时间尝试拟合曲线,random 一词的一个很好的定义是没有函数可以生成真正随机的数据序列。如果您的意思是类似于“幅度和相位随机变化的正弦曲线”,这就是拟合优度测量的用途,它们量化了您的模型(即您选择的函数)和数据之间的差异你参与到这个过程中。

【讨论】:

    【解决方案2】:

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

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

    如果您的数据非常不稳定,您可以尝试使用样条曲线进行近似。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 如果 OP 不确定使用三角函数建模怎么办?
      • 究竟为什么 FFT 是要走的路:它知道该怎么做,即使 OP 不知道。
      【解决方案4】:

      如果您对正在建模的函数一无所知,只想找到转折点,则可以对曲线进行微分并找到与零相交的位置。

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

      【讨论】:

      • 我应该只区分地区吗?整个事情可能有多达 50 条曲线,这不会产生很大程度上不准确的回归吗?
      • 你是说同一个数据集中有50条曲线?
      • @user293895 如果您担心效率,那么肯定有比这更好的方法。如果您知道要建模的近似函数,那么您也可以通过首先拟合数学模型来近似转折点。这真的取决于你想要做什么。
      • 我不推荐这种方法;请参阅下面的答案。
      【解决方案5】:

      我昨天想出的一个解决方案:在数据上使用滑动窗口(我使用数据集大小的 5 分之一),并为局部最小值和最大值投票,当窗口在数据上滑动时,大多数投票倾向于成为曲线的中心。为了进一步处理,一旦我有了这些数据,我将对这些点设置阈值以将其稀释到几个强点,然后执行多项式回归(到 3 度),取 a 值(在 ax^2+bx+c 中)确定曲线的大小(如果太平,则认为它是一条异常的直线)。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 2013-11-27
        • 2011-10-14
        • 2018-12-18
        • 1970-01-01
        • 2015-10-19
        • 2022-01-19
        相关资源
        最近更新 更多