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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

7115閲覧

Python Scipyによるゴンペルツ曲線の描画プログラムのRunTimeエラー

minhouse10

総合スコア41

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/01/14 14:19

編集2019/01/14 16:37

hayataka2049様のアドバイスに沿って、コードを修正した所、以下のようなグラフを出力する事ができました。
イメージ説明

さらにhayataka2049様からなめらかなフィッティング結果になる様、np.linespace(開始、終了、要素数)のx軸への適用を追加でご教授頂き、理想的なグラフに仕上げる事ができました!

イメージ説明

再度最新の修正版のコードは以下のとおりです。

array_t = np.array([0,24,36,48,60,72]) #時間軸として0から24、以降12時間単位で時間の進行を示す array_y = np.array([0,92.7,95.28,95.34,95.35,95.4]) #時間軸のt値に対応した各y値はパーセンテージを示す def gomperts_f(t,a,b,k): return k*pow(a,(pow(b,t))) param, cov = curve_fit(gomperts_f, array_t, array_y, p0=[8.13e-13,7.5e-01,1e+2]) x = np.linspace(-10, 100, 1000) #y = gomperts_f(array_t,param[0],param[1],param[2]) y = [gomperts_f(x, *param) for x in x] plt.plot(array_t, array_y, 'o') plt.plot(x, y, '-') plt.xlabel("Hours") plt.ylabel("Success Rate") plt.grid(True) t_freq = 24 plt.axvline(t_freq, color='b', label='15min', linestyle='-', linewidth=1) plt.text(array_t[1], t_freq, "24h line", fontsize = 10) for x, y in zip(array_t, array_y): plt.text(x, y, y, ha='center', va='bottom') plt.show()

以下の2つの配列の情報を使って、ゴンペルツ曲線を描画するプログラムを作成しているのですが、RunTimeエラーが発生してしまいます。
t軸の0,24,36への対応として、y軸が0, 92.7,95.28に達した後は以降72までy値が微増している様子を曲線で描画したいと思っております。

出力されたエラー内容で検索すると、カーブにフィットさせる事ができずに800のしきい値に達しエラーがでているようです。
tまたはyに適しない配列データを渡しているのでしょうか? 大変恐縮ですが、どなたかアドバイス頂戴できればと存じます。
よろしくお願い致します。

イメージ説明

関数gomperts_fの定義は以下の数式の定理に沿っています。
イメージ説明

import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt array_t = np.array([0,24,36,48,60,72]) #時間軸として0から24、以降12時間単位で時間の進行を示す array_y = np.array([0,92.7,95.28,95.34,95.35,95.4]) #時間軸のt値に対応した各y値はパーセンテージを示す def gomperts_f(t,a,b,k): return k*pow(a,(pow(b,t))) param, cov = curve_fit(gomperts_f, array_t, array_y) print(param, cov)

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

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

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

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

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

hayataka2049

2019/01/14 14:39 編集

yが0から90以上に飛んでほぼ横ばい、ということは/ ̄のような形のデータだと思います。そもそもその関数でfitさせるのは無理では? ↑いや、やればできるのかな。a,bは1未満か。ちょっと考え直します。
minhouse10

2019/01/14 14:52

hayataka2049様、ご確認及びコメント頂き、本当にありがとうございます! はい、調べて見た所ロジスティック曲線ですと変曲点に対し左右対象となりますが、ゴンペルツ曲線では変曲点に対して対象ではないとの事でしたので、この場合ゴンペルツ曲線が近いのではと思った次第です。
hayataka2049

2019/01/14 14:54

いかんせんexpが二段重ねではぶっ飛んじゃって、きついと思います。一応まともそうな初期値を見つけたので回答しましたけど
minhouse10

2019/01/14 16:19

hayataka2049様、お時間ある時で結構ですので、もう一点ご教授頂きたいのですが、どのようにしたらhayataka2049様の2番目のグラフの様にきれいな曲線が描けるでしょうか? 追加させて頂いた私のグラフ出力のようにカクカクした曲線になってしまっています。
hayataka2049

2019/01/14 16:24

こういうことですね。 x = np.linspace(-10, 100, 1000) y = [gomperts_f(x, *param) for x in x] plt.plot(x, y)
minhouse10

2019/01/14 16:39

hayataka2049様、ありがとうございます!!ご教授頂いた通り、np.linespace(開始、終了、要素数)のx軸への適用で理想的なグラフに仕上げる事ができました!本当にこの度は勉強になりました、重ねてお礼申し上げます。
guest

回答1

0

ベストアンサー

初期値をいじったらとりあえずそれっぽく動きました。共分散は計算できないらしいですが。

python

1param, cov = curve_fit(gomperts_f, array_t, array_y, p0=[1e-10,1e-1,1e+1])
OptimizeWarning: Covariance of the parameters could not be estimated category=OptimizeWarning) [4.91924818e-17 1.00000000e-01 9.48138354e+01] [[inf inf inf] [inf inf inf] [inf inf inf]]

イメージ説明

極端な関数だし、最初が0というのもあって、難しいんだと思う。


たまたま見つけた良さげな初期値。

python

1param, cov = curve_fit(gomperts_f, array_t, array_y, p0=[8.13e-13,7.5e-01,1e+2])
[8.08446760e-13 7.50446814e-01 9.53647509e+01] [[2.39958219e-22 3.34505451e-13 1.19587853e-13] [3.34505451e-13 4.66421851e-04 1.68726895e-04] [1.19587853e-13 1.68726895e-04 2.25807180e-04]]

イメージ説明

投稿2019/01/14 14:52

hayataka2049

総合スコア30933

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

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

minhouse10

2019/01/14 14:59

hayataka2049様、素晴らしいですね、改めてこんなに早く解決に導いて頂いて感動です、ありがとうございました!!!初期値を渡して補正してあげるとは想像できませんでした。非常に勉強になりました。今後も精進して行きます!
minhouse10

2019/02/24 12:28

hayataka2049様、先日は大変有益なご教示を頂き、改めてありがとうございました。 よろしければもう一点ご教授頂きたいことがあるのですが、丁度当てはまりの良い初期値を探すための考え方、身につけるべき知識など、アドバイス頂くことは可能でしょうか?大変恐縮でございますが、よろしくお願い致します。
hayataka2049

2019/02/24 13:39

割と適当です。とりあえず適当な初期値でやってみて、出た値に近づけていく感じでやりました。
minhouse10

2019/02/24 15:14

hayataka2049様、ご回答頂き、真にありがとうございます!試行錯誤の中で見つけていくしかないのですね、決まったやり方がないということが分かっただけでも、今後前向きな気持ちで勉強していけます。改めて時間が経過していたにもかかわらずご回答頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問