曲线示例如下所示。弯头点可能是 x=3 或 4。如何以数学方式自动计算曲线的弯头?
问问题
23475 次
4 回答
23
我创建了一个尝试实现Kneedle 算法的 Python包。
要重新创建上述函数并检测最大曲率点:
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')
更新
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')
于 2018-04-12T23:22:41.623 回答
20
您可能想寻找具有最大绝对二阶导数的点,对于x[i]
您在那里的一组离散点,可以用中心差来近似:
secondDerivative[i] = x[i+1] + x[i-1] - 2 * x[i]
如上所述,您真正想要的是具有最大曲率的点,但是二阶导数可以,并且这个中心差异是二阶导数的良好代表。
于 2010-12-17T17:18:39.833 回答
4
像这样的函数通常因其形状而被称为L 曲线。它们在通过正则化解决不适定问题时出现。
“肘”点是曲线上具有最大绝对二阶导数的点。
于 2010-12-17T15:42:26.527 回答
1
您真正想要的是具有最大曲率的点。当斜率远小于 1 时,这可以通过二阶导数来近似(正如@ebo 指出的那样),但情况并非总是如此。
于 2010-12-17T15:42:52.920 回答