29

曲線の一例を以下に示します。エルボポイントはx=3または4の場合があります。曲線のエルボを自動的かつ数学的に計算するにはどうすればよいですか?

代替テキスト

4

4 に答える 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')

ここに画像の説明を入力してください

update
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]

上記のように、本当に必要なのは最大曲率の点ですが、2次導関数でもかまいません。この中心的な違いは、2次導関数の適切なプロキシです。

于 2010-12-17T17:18:39.833 に答える
4

このような関数は、通常、その形状からLカーブと呼ばれます。それらは、正則化によって不適切な問題を解決するときに表示されます。

「エルボ」ポイントは、絶対二階導関数が最大の曲線上のポイントです。

于 2010-12-17T15:42:26.527 に答える
1

本当に必要なのは、最大曲率のポイントです。傾きが1よりもはるかに小さい場合、これは2階導関数で近似できます(@eboが指摘しているように)が、常にそうであるとは限りません。

于 2010-12-17T15:42:52.920 に答える