以稳定的方式找到曲线的肘点?
我知道有关于这个话题的这个问题和这个问题。不过,这次我想在Python中实现一个具体的例子。
我唯一的问题是,肘部点(elbow point)在我代码的不同运行中似乎会变化。看看这篇文章中展示的两个图。虽然它们看起来很相似,但肘部点的数值却有很大不同。这两个曲线是通过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)
1 个回答
3
听起来你真正关心的是如何让你的数据更平滑,因为它里面有噪音?如果是这样的话,也许你可以先给数据拟合一条曲线,然后再找出这条曲线的“肘部”位置?
这个方法是否有效,取决于噪音的来源,以及这些噪音对你的应用是否重要?顺便提一下,你可能想看看你的拟合对数据的敏感程度,也就是当你去掉一个数据点时,拟合结果会怎么变化(希望是变化不大)。显然,如果使用一个足够高的多项式,你总能很好地拟合一组特定的数据,但你可能更关心的是一般情况下的表现。
我不知道这个方法是否可行,但直观上我觉得对小错误的敏感性是不好的。最终,通过拟合曲线,你是在说理想情况下,底层的过程是由这条曲线来描述的,而任何偏离这条曲线的地方都是错误或噪音。