以稳定的方式找到曲线的肘点?

时间:2011-07-12 04:55:21

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

我知道此主题中存在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)  

enter image description here enter image description here

1 个答案:

答案 0 :(得分:3)

听起来您的实际问题是如何平滑数据,因为它包含噪音?在这种情况下,您可能应首先在曲线上拟合曲线,然后找到拟合曲线的弯头?

这是否有效取决于噪音的来源,以及噪音对您的应用是否重要?顺便说一句,当你从拟合中省略一个点时,你可能希望看到它对你的数据的拟合程度有多敏感(或者希望不会改变)(显然有一个足够高的多项式,你总能得到一个很好的拟合)对于一组特定的数据,但您可能对一般情况感兴趣)

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