私はMatlabの経験がほとんどないので、以下のnumpy/scipyコードを与えます。
カーブが十分に滑らかであれば、あなたの転換点は最高のものであることがわかりますcurvature。曲線パラメータとしてポイントインデックス番号、およびcentral differences schemeを取ると、あなたはおそらく、最も高いを識別し、曲率を計算し、最初にあなたの曲線を滑らかにしたいと思うでしょう、次のコード
import numpy as np
import matplotlib.pyplot as plt
import scipy.ndimage
def first_derivative(x) :
return x[2:] - x[0:-2]
def second_derivative(x) :
return x[2:] - 2 * x[1:-1] + x[:-2]
def curvature(x, y) :
x_1 = first_derivative(x)
x_2 = second_derivative(x)
y_1 = first_derivative(y)
y_2 = second_derivative(y)
return np.abs(x_1 * y_2 - y_1 * x_2)/np.sqrt((x_1**2 + y_1**2)**3)
で曲率を計算することができます湾曲点。以下の機能がないだけで:説明
def plot_turning_points(x, y, turning_points=10, smoothing_radius=3,
cluster_radius=10) :
if smoothing_radius :
weights = np.ones(2 * smoothing_radius + 1)
new_x = scipy.ndimage.convolve1d(x, weights, mode='constant', cval=0.0)
new_x = new_x[smoothing_radius:-smoothing_radius]/np.sum(weights)
new_y = scipy.ndimage.convolve1d(y, weights, mode='constant', cval=0.0)
new_y = new_y[smoothing_radius:-smoothing_radius]/np.sum(weights)
else :
new_x, new_y = x, y
k = curvature(new_x, new_y)
turn_point_idx = np.argsort(k)[::-1]
t_points = []
while len(t_points) < turning_points and len(turn_point_idx) > 0:
t_points += [turn_point_idx[0]]
idx = np.abs(turn_point_idx - turn_point_idx[0]) > cluster_radius
turn_point_idx = turn_point_idx[idx]
t_points = np.array(t_points)
t_points += smoothing_radius + 1
plt.plot(x,y, 'k-')
plt.plot(new_x, new_y, 'r-')
plt.plot(x[t_points], y[t_points], 'o')
plt.show()
一部がオーダーである:あなたが
smoothing_radius
を確認したい点の数を適用する平滑コンボリューションの半径
turning_points
ですあなたのデータに曲率を計算する前に
cluster_radius
は、曲率の高いポイントから他のポイントを候補として考慮しない転回ポイントとして選択されたポイントまでの距離です。
あなたは少しのパラメータをいじっする必要がありますが、私はこのようなものだ:
>>> x, y = np.genfromtxt('bla.data')
>>> plot_turning_points(x, y, turning_points=20, smoothing_radius=15,
... cluster_radius=75)
おそらくない良い十分な完全に自動化された検出のために、それはかなりですあなたが望むものに近い。
非常に興味深い問題ですが、このフォーラムが尋ねるのが適切かどうかはわかりません。私は軌道の転換点を定義する多くの主観的な方法を見ています。あなたが非常によく見ると、私は多くの異なる転換点を見ることができます。進める方法は、各点の両側の点のスムージング(またはn点を使用して直線を描く)なのかもしれませんし、その2つの直線の間の角度を決定してください。次に、整列アルゴリズムにもかかわらず、2つのパラメータ(nとminの角度)のみを使用します。とにかくこれはとにかく助けますか? – Alex
@Alex私はこの問題の主観を認識しています。私はまだこれが一般的な関心事の問題かもしれないと思っています。私は人々が地元の転換点とグローバルなものを切り離すために使うかもしれないさまざまなアプローチについて議論しているのを見たいと思っています。 – memyself