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)
yが0から90以上に飛んでほぼ横ばい、ということは/ ̄のような形のデータだと思います。そもそもその関数でfitさせるのは無理では?
↑いや、やればできるのかな。a,bは1未満か。ちょっと考え直します。
hayataka2049様、ご確認及びコメント頂き、本当にありがとうございます!
はい、調べて見た所ロジスティック曲線ですと変曲点に対し左右対象となりますが、ゴンペルツ曲線では変曲点に対して対象ではないとの事でしたので、この場合ゴンペルツ曲線が近いのではと思った次第です。
いかんせんexpが二段重ねではぶっ飛んじゃって、きついと思います。一応まともそうな初期値を見つけたので回答しましたけど
hayataka2049様、お時間ある時で結構ですので、もう一点ご教授頂きたいのですが、どのようにしたらhayataka2049様の2番目のグラフの様にきれいな曲線が描けるでしょうか? 追加させて頂いた私のグラフ出力のようにカクカクした曲線になってしまっています。
こういうことですね。
x = np.linspace(-10, 100, 1000)
y = [gomperts_f(x, *param) for x in x]
plt.plot(x, y)
hayataka2049様、ありがとうございます!!ご教授頂いた通り、np.linespace(開始、終了、要素数)のx軸への適用で理想的なグラフに仕上げる事ができました!本当にこの度は勉強になりました、重ねてお礼申し上げます。

回答1件
あなたの回答
tips
プレビュー