自动和数学地计算曲线的“肘点”

32

下面展示了曲线的一个例子。拐点可能是x=3或4。 如何通过自动化和数学方法来计算曲线的拐点?

alt text


你可以在这里提问:http://math.stackexchange.com/。但无论如何,你需要提供一些关于曲线是如何产生以及可能的形状的背景信息。 - TToni
6
可能是重复的问题:如何在曲线上找到最佳的权衡点。 - Jacob
1
这个问题有一个很好的答案。请查看我发布的可能重复的链接。 - Jacob
在曲线上找到最佳权衡点的解决方案(https://dev59.com/wHI-5IYBdhLWcg3wF0Qc)是一个不错的建议。然而,这个解决方案取决于曲线上的点。 我采纳了@ebo和@Chris Taylor的建议,寻找具有最大绝对二阶导数的点,对于一组离散点x[i],可以用中心差分来近似: secondDerivative(i) = x(i+1) + x(i-1) - 2 * x(i); [max,idx] = max(secondDerivative); - Jie
4个回答

24

我创建了一个Python ,尝试实现Kneedle算法

要重新创建上述函数并检测最大曲率点:

x = range(1,21)
y = [0.065, 0.039, 0.030, 0.024, 0.023, 0.022, 0.019, 0.0185, 0.0187,
     0.016, 0.015, 0.016, 0.0135, 0.0130, 0.0125, 0.0120, 0.0117, 0.0115, 0.0112, 0.013]

kn = KneeLocator(
    x,
    y,
    curve='convex',
    direction='decreasing',
    interp_method='interp1d',
)

print(kn.knee)
7
import matplotlib.pyplot as plt
plt.xlabel('x')
plt.ylabel('f(x)')
plt.xticks(range(1,21))
plt.plot(x, y, 'bx-')
plt.vlines(kn.knee, plt.ylim()[0], plt.ylim()[1], linestyles='dashed')

enter image description here

更新
Kneed拥有一种更好的样条拟合方法来处理局部极小值,使用interp_method = 'polynomial'

kn = KneeLocator(
    x,
    y,
    curve='convex',
    direction='decreasing',
    interp_method='polynomial',
)

print(kn.knee)
4

还有新的情节:

plt.xlabel('x')
plt.ylabel('f(x)')
plt.xticks(range(1,21))
plt.plot(x, y, 'bx-')
plt.vlines(kn.knee, plt.ylim()[0], plt.ylim()[1], linestyles='dashed')

这里输入图片描述


22
你可能想要寻找具有最大绝对二阶导数的点,对于像你提供的离散点集x[i],可以使用中心差分来近似计算:

secondDerivative[i] = x[i+1] + x[i-1] - 2 * x[i]

如上所述,你真正想要的是曲率最大的点,但二阶导数足够,这种中心差分是二阶导数的很好代理。


2
提供的数据存在噪音。你需要比那更加小心。你的建议可能会识别出例如x=12或x=19这样的结果。 - Josephine
1
嗨,Chris,你给了我一个很好的答案。你能告诉我这个解决方案是否有参考资料吗?我想起草一篇论文,所以需要这个解决方案的参考资料。 - Jie
2
你能解释一下在什么条件下这个近似值是一个不错的估计,以及在什么条件下会完全失准吗? - Omley
3
你真正想要的是最大曲率的点,但第二导数也可以。关于曲率的观点似乎正确,但第二导数并不总是适用(甚至可能从未适用):考虑像exp(-x)这样的函数——它有一个肘部,但其二阶导数并没有任何事件类似于肘部所在的最大值。 - Alex Fainshtein
Alex Fainshtein是正确的,它并不总是有效,特别是对于exp(-x)...问题中的确切示例信号有波动,二阶导数改变了符号...回答Omley的问题,如果信号不单调,这个近似是不正确的。 - gevra
显示剩余2条评论

4
这种函数通常被称为L曲线,因为它们的形状。当通过正则化解决不适定问题时,它们会出现。
“拐点”是曲线上具有最大绝对二阶导数的点。

是的,你的想法和克里斯·泰勒一样。谢谢。 - Jie
1
另一个问题是为什么“拐点”是曲线上绝对二阶导数最大的点? - Jie

1

你真正想要的是曲率最大的点(curvature)。当斜率远小于1时,这可以通过二阶导数来近似(正如@ebo所指出的那样),但并非总是如此。


但是m甚至不是1。提示:查看轴刻度。 - TToni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接