【问题标题】:Finding the elbow point of a curve in a stable way?以稳定的方式找到曲线的肘点?
【发布时间】:2011-10-03 07:56:53
【问题描述】:

我知道thisthis 在这个主题上的存在。但是,这次我想最终确定 Python 中的实际实现。

我唯一的问题是肘点似乎随着我的代码的不同实例而变化。观察这篇文章中显示的两个图。虽然它们在视觉上看起来相似,但肘点的值发生了显着变化。两条曲线均由平均 20 次不同的运行生成。即便如此,肘点的值也会发生显着变化。我可以采取哪些预防措施来确保该值在一定范围内?

我的尝试如下所示:

def elbowPoint(points):
  secondDerivative = collections.defaultdict(lambda:0)
  for i in range(1, len(points) - 1):
    secondDerivative[i] = points[i+1] + points[i-1] - 2*points[i]

  max_index = secondDerivative.values().index(max(secondDerivative.values()))
  elbow_point = max_index + 1
  return elbow_point

points = [0.80881476685027154, 0.79457906121371058, 0.78071124401504677, 0.77110686192601441, 0.76062373158581287, 0.75174963969985187, 0.74356408965979193, 0.73577573557299236, 0.72782434749305047, 0.71952590556748364, 0.71417942487824781, 0.7076502559300516, 0.70089375208028415, 0.69393584640497064, 0.68550490458450741, 0.68494440529025913, 0.67920157634796108, 0.67280267176628761]
max_point = elbowPoint(points)  

【问题讨论】:

  • 只是一个小旁注:您不应该将 defaultdict 用于具有默认值的函数,因为这样会在 yourDefaultDict[i] 处为您查询的所有值 i 创建一个字典条目。在这里我看不出有什么问题。
  • @ninjagecko:哦!你说得对!我会修复我的版本。感谢您指出这一点。

标签: python math statistics machine-learning numerical-methods


【解决方案1】:

听起来您真正关心的是如何平滑包含噪声的数据?在这种情况下,也许您应该先对数据拟合一条曲线,然后找到拟合曲线的肘部?

这是否可行取决于噪声源,以及噪声对您的应用程序是否重要?顺便说一句,您可能想通过查看拟合中省略某个点时(或希望不会)如何更改(或希望不会)来查看拟合对数据的敏感程度(显然,使用足够高的多项式,您将始终获得良好的拟合到一组特定的数据,但您可能对一般情况感兴趣)

我不知道这种方法是否可以接受,虽然我认为对小错误的敏感性很糟糕。最终通过拟合曲线,您是说在理想情况下,基础过程是由曲线建模的,并且与曲线的任何偏差都是错误/噪声

【讨论】:

  • +1 谢谢。我尝试使用 4 次多项式拟合曲线,这对我来说看起来不错。现在唯一的问题是确定平滑是否被认为是一种可接受的方法。任何指向它的指针都会很棒。
猜你喜欢
  • 2019-01-16
  • 2023-03-28
  • 2017-05-21
  • 2012-06-12
  • 2014-08-15
  • 2019-12-16
  • 1970-01-01
  • 2019-02-03
相关资源
最近更新 更多