線形/非線形回帰による2つの曲線のあてはめ


8

JuMPを使用して、2つの曲線(どちらも3次関数に属する)を一連の点にフィットさせる必要があります。

1つのカーブのフィッティングを実行しましたが、2つのカーブを同じデータセットにフィッティングするのに苦労しています。

ポイントをカーブに分配できれば、つまり各ポイントが1度しか使用できなければ、以下のようにできると思いましたが、うまくいきませんでした。(私はもっと複雑なものを使うことができることを知っています、私はそれを単純に保ちたいです。)

これは私の現在のコードの一部です:

# cubicFunc is a two dimensional array which accepts cubicFunc[x,degree]

@variable(m, mult1[1:4]) // 0:3 because it's cubic
@variable(m, mult2[1:4]) // 0:3 because it's cubic

@variable(m, 0 <= includeIn1[1:numOfPoints] <= 1, Int)
@variable(m, 0 <= includeIn2[1:numOfPoints] <= 1, Int)

# some kind of hack to force one of them to 0 and other one to 1
@constraint(m, loop[i in 1:numOfPoints], includeIn1[i] + includeIn2[i] == 1)

@objective(m, Min, sum( (yPoints - cubicFunc*mult1).*includeIn1 .^2 ) + sum( (yPoints - cubicFunc*mult2).*includeIn2 .^2 ))

しかし、それは私がしようとしていることに応じてさまざまなエラーを出します。*includeIn1そして、.*includeIn1動作しません、私はそれをやろうとしました@NLobjectiveが、それは私に〜50行のエラーなどの叫びを与えました

私の考えは現実的ですか?コードに入れることはできますか?

どんな助けも高く評価されます。どうもありがとうございました。


データを投稿またはリンクしていただけますか?
James Phillips

1
@JamesPhillips ofc、xは[0,10]の範囲内yPoints = [ 3, 6, 5, 7, 3, 3, 1, 0, 4, 1]
grtnh

回答:


4

たとえば、次のように問題を書き留めることができます。

using JuMP, Ipopt

m = Model(with_optimizer(Ipopt.Optimizer))

@variable(m, mult1[1:4])
@variable(m, mult2[1:4])
@variable(m, 0 <= includeIn1[1:numOfPoints] <= 1)
@variable(m, 0 <= includeIn2[1:numOfPoints] <= 1)

@NLconstraint(m, loop[i in 1:numOfPoints], includeIn1[i] + includeIn2[i] == 1)

@NLobjective(m, Min, sum(includeIn1[i] * (yPoints[i] - sum(cubicFunc[i,j]*mult1[j] for j in 1:4)) ^2 for i in 1:numOfPoints) +
                     sum(includeIn2[i] * (yPoints[i] - sum(cubicFunc[i,j]*mult2[j] for j in 1:4)) ^2 for i in 1:numOfPoints))

optimize!(m)

制約を考えるincludeIn1と、includeIn2なります10、我々はバイナリであるためにそれらを制約する必要はありませんので、(彼らはそれがどのグループにあなたがポイントを割り当てる問題ではないことを、この手段がない場合)に最適なインチ また、問題は線形または2次の最適化タスクとして再定式化することができないようであるので、非線形ソルバーを使用します。

ただし、上記のコードは、それを書き留める方法の例としてのみ示しています。作成したタスクには、固有のローカルミニマム(つまり、グローバルミニマム)はありませんが、いくつかのローカルミニマムがあります。したがって、JuMPがサポートする標準の非線形凸ソルバーを使用すると、1つのローカル最適値のみが検出されます(必ずしもグローバル最適値とは限りません)。グローバルオプティマを探すには、https//github.com/robertfeldt/BlackBoxOptim.jlなどのグローバルソルバーに切り替える必要があります


これで解決したようです、ありがとうございました!
grtnh

コードは機能しますが、コメントされたローカル極値のみを検出します。
BogumiłKAMINSKI
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.