5

ほぼ単調なデータに単調曲線を当てはめようとしています。(X 値は単調であり、Y 値は単調である必要がありますが、ノイズは多くの場合、基になる値のポイントごとの変化よりも大きくなります。) ここで、私が現在行っていることの要約を示します。

def goodness_of_fit(Xfit):
    assert(is_sorted(Xfit))
    # ( Calculate the area between the fit line and the join-the-dots line from the data )

scipy.optimize.minimize(goodness_of_fit, x0=numpy.linspace(xmin, xmax))

Xfit配列をソートしたままにする最適化アルゴリズムを取得する方法が見つかりません-誰か提案はありますか? (配列のサイズが大きすぎて、N-1 個の個別の順序付け制約を作成し、制約付き最適化関数を使用することはできません。) 最適なソリューションが以下でしか利用できない場合は、Python 以外の別の言語を喜んで使用します。その言語。

(NB、実際には Y 値ではなく X 値をフィッティングしています。これは、最終的に dX/dY 曲線をプロットし、生データからプロットした場合のようにばかげた値に膨らまないようにしたいためです。ただし、 、固定 X 値に Y 値を合わせる方がはるかに簡単な場合は、代わりにそれを行うことができます。)

4

2 に答える 2

2

厳密に単調なサブセットである Xfit から新しい配列を作成し、それに曲線を当てはめてみませんか? 何かのようなもの:

Xfit      = np.hstack(((-1,-1,0,1,1),np.arange(1,10),(-7,9,10,10)))
len_mono  = 0
Xfit_mono = zeros(Xfit.size)
Xfit_mono_ind = zeros(Xfit.size)
Xfit_mono[len_mono] = Xfit[0]

for(iX, x) in enumerate(Xfit):
    if iX > 0:
        if x > Xfit_mono[len_mono]:
            len_mono = len_mono + 1
            Xfit_mono[len_mono] = x
            Xfit_mono_ind[len_mono] = iX 
Xfit_mono_ind = Xfit_mono_ind[:len_mono+1]
Xfit_mono = Xfit_mono[:len_mono+1]
print(Xfit_mono_ind)
print(Xfit_mono)

次に、代わりにカーブ フィッティングで Xfit_mono を使用できます。関連する y 値を選択する場合は、Xfit_mono_ind の値を y のインデックスとして使用できます。

アップデートは以下を置き換えます:

if x > Xfit[iX-1]:

と:

if x > Xfit_mono[len_mono]:

弱く増加させるには、古いソリューションが機能します。ただし、以前の結果は、減少している場合は間違った答えを出しました。この更新により、両方のケースで望ましい結果が得られます。

于 2012-12-19T12:50:18.597 に答える
1

最後に、値自体ではなく、連続する X 値の差をフィッティングすることでそれを行いました。その後、ゼロの単純な下限を使用できます。

def fg(X):
    # return the objective function and its Jacobian

def adjusted_fg(X_diff):
    X = cumsum(X_diff)
    score, jac = fg(X)
    jac[1:] = np.diff(jac)
    return score, jac

X0_diff[1:] = [X0[0]] + np.diff(X0)
bounds = [(None, None)] + [(0, None) for i in range(len(X0)-1)]

scipy.optimize.minimize(adjusted_fg, X0_diff, method='L-BFGS-B', bounds=bounds)

N が大きい場合、これは解の近くで開始しないと不安定になるか、極小値に陥る傾向があるため、最初に小さい N (たとえば N/10) でフィッティングを試み、次に補間して取得します。大きな N フィットに対してより良い X0。

(NB私の問題では、実際には厳密な順序付けが必要なので、0ではなく正の下限を使用しました)

于 2012-12-20T13:44:28.883 に答える