質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

661閲覧

32個以上のデータに対して非線形フィッティング

youseiranbu7

総合スコア6

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/11/13 14:30

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
今、60個のデータ(x1,y1),...,(x60,y60)について、scipy.optimizeのcurve_fitを使って、パラメータa,bを持つ非線形関数f(x)=a*exp(x**2+x+b)でフィッティングをしたいと思っています。

###発生している問題・エラーメッセージ
xdata=np.ndarray(x)
ydata=np.ndarray(y)
parameter_optimal , covariance
=scipy.optimize.curve_fit(f,xdata,ydata)
として、フィッティングをしたいのですが、
xdata=np.ndarray(x)
ValueError: sequence too large; must be smaller than 32
と出てきてしまい、先に進めません。
どうすればこの60個のデータを非線形関数でフィッティングできるでしょうか。
pythonであれば他の方法(leastsqなど)でも良いので教えてください。
エラーメッセージ
xdata=np.ndarray(x)
ValueError: sequence too large; must be smaller than 32
###該当のソースコード
python
xdata=np.ndarray(x)
ydata=np.ndarray(y)
parameter_optimal , covariance
=scipy.optimize.curve_fit(f,xdata,ydata)

###試したこと
課題に対してアプローチしたことを記載してください
np.ndarrayの代わりに
np.arrayを使ってみたのですが、今度は
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
と出てしまいます。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2017/11/14 06:26

変数x,yの生成部分のコード(具体的にどのようなデータ型になっているか)も提示ください。
guest

回答2

0

a exp(x^2+x+b)の形でフィッティングするのは得策ではありません。
理由は解に一意性がない(未知パラメータa,bが無限に存在する)からです。

a exp(x^2+x+b) = a exp(b)exp(x^2+x)ですから、a,bを求めるのではなく c exp(x^2+x)でフィッティングすればよいでしょう。この場合、cは一意に定まります。

cが求まったあと、c = a exp(b)を満たすa,bを求めてもよいですが、そのようなa,bの組み合わせは無限にありますし、何か一組を求めてみてもその組自体に意味はありません。

投稿2017/11/13 22:32

編集2017/11/14 01:42
WathMorks

総合スコア1582

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkgrei

2017/11/14 00:41 編集

最適化のアルゴリズムには明るくないのでなんとも言えないのですが、cは、a,bが決まればまとめることができます。 a,b自体に意味なかったとしても、最終的にcを得られることに変わりはありません。 ただ気になるとすれば収束先で得られるcというわけですが、①Levenerg-Marquardt法を使っていること、②xdataとydataの組み合わせが同じこと、が同じ条件であればcへの収束性はa,bを使った場合と同じになるでしょうか? 自由度が高い分、局所最適解を迂回できるとも考えられるし、自由度が高い分局所最適解が多くなってハマりやすいとも思えます。 何か一般的な性質があるのならご教授願いたくございます。
WathMorks

2017/11/14 00:57

「最終的にcが得られることに変わりありません」。ロジックが逆ですね。cを求める問題(一変数の凸最適化問題)として定式化し、そこから出発することが重要です。(狭義)凸最適化問題であれば、一般的に解の一意性が保証されます。したがって(まともな)解法であれば何を使っても必ず解が求まります。 (今回の問題はコスト関数が2乗ノルムなら解は解析的に求まります。) また、求まった曲線は c exp(x^2+x)と書けますから、c= a exp(b)を満たす任意に組(a,b)を求めたところで、ご利益は何らありません。 「自由度が高い分、局所最適解を迂回できるとも考えられるし、自由度が高い分局所最適解が多くなってハマりやすいとも思えます。」 自由度と局所解うんぬん、は無関係です。注目すべき点は、コスト関数は凸か非凸か、ということです。凸最適化問題として解ける問題を非凸最適化問題のまま扱うのはナンセンスです。
mkgrei

2017/11/14 05:04

問題の性質について把握しておりませんでした。 この提示されている最適化問題は狭義の凸最適化問題に分類されるので、そのための解法を使うべきという認識で正しいでしょうか? 一般な最適化問題に対する反復法解法を想像していました。 ※誤って回答に投稿してしまいました。
mkgrei

2017/11/14 07:32

勉強になりました。ありがとうございます。 比較してみた結果を加えて回答を修正しました。
guest

0

乱数でデータを生成しているのでいつも解が得られるわけではありませんが、素直に書いてもエラーは出ませんでした。

python

1import numpy as np 2from math import exp 3from scipy.optimize import curve_fit 4def f1(x, a, b): 5 return a*np.exp(x*x+x+b) 6def f2(x, c): 7 return c*np.exp(x*x+x) 8 9n = 60 10x = np.random.random(n) 11y = np.random.random(n) 12(a, b), cov = curve_fit(f1, x, y) 13(c), cov = curve_fit(f2, x, y) 14print('a, b, a*exp(b), c', a, b, a*np.exp(b), c) 15print('MAE[a,b], MAE[c]', np.mean(np.abs(f1(x, a, b)-y)), np.mean(np.abs(f2(x, c)-y)))

追記:
rkhsさんの回答を受けてcに対する最適化問題も追加しました。
比較も残しました。

cに対して最適化を行うと正しいフィッティングが得られます。
a,bに対して行うと、運が良ければ解が一致します。
ただし正しくフィッティングできないときもあります。

やはり余分なパラメータを加えると局所最適解にハマりますね。
いろいろと試してみてください。

投稿2017/11/13 14:45

編集2017/11/14 07:30
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問