下記がネットで見つけたコードで、問題なく動きます。
python
1import numpy as np 2import pylab 3from scipy.optimize import curve_fit 4 5def sigmoid(x, x0, k, a, c): 6 y = a / (1 + np.exp(-k*(x-x0))) + c 7 return y 8 9 10xdata = np.array([2,3,4,5,6]) 11ydata = np.array([0.008297893 ,0.039821333,0.172234748,1.114911766, 1.2]) 12 13init_params = np.array([1, 1, 1, 0]) 14xlim = (min(xdata) - (max(xdata)-min(xdata))/4.0, max(xdata)+(max(xdata)-min(xdata))/4.0) 15ylim = (min(ydata) - (max(ydata)-min(ydata))/4.0, max(ydata)+(max(ydata)-min(ydata))/4.0) 16sigmoid_format = r'$y = \frac{%f}{1 + e^{-%f (x - %f)}} + %f$' 17 18popt, pcov = curve_fit(sigmoid, xdata, ydata, init_params) 19print("Result : x0=%f, k=%f, a=%f, c=%f" % (popt[0], popt[1], popt[2], popt[3])) 20 21x = np.linspace(xlim[0], xlim[1], 200) 22yinit = sigmoid(x, *init_params) 23yopt = sigmoid(x, *popt) 24 25pylab.plot(xdata, ydata, 'o', label='Target') 26pylab.plot(x, yinit, label=('Pre-Opt : ' + (sigmoid_format % (init_params[2], init_params[1], init_params[0], init_params[3]))) ) 27pylab.plot(x, yopt, label=('Optimized : ' + (sigmoid_format % (popt[2], popt[1], popt[0], popt[3]))) ) 28pylab.ylim(ylim[0], ylim[1]) 29pylab.legend(loc='upper left') 30pylab.grid(True) 31pylab.show()
しかし、それぞれの座標を示すxdataとydataを下記のように変更すると上手く処理できませんでした。式の描画だけでなく、x0,k,a,cの値から形成される式も間違っていました。
xdata = np.array([1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 , 18 , 19, 20 ,21 ,22])
ydata = np.array([12,12,12,12,13,12,12,12,12,13,15,15,15,16,15,15,14,15,15,15,15,15])
しかしこのようにしたらできました。
xdata = np.array([1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 , 18 , 19, 20 ,21 ,22])
ydata = np.array([2,2,2,2,3,2,2,2,2,3,5,5,5,6,5,5,4,5,5,5,5,5])
実際は、xは38004400、yは1000020000くらいの値を入れたいです。
コードの各行の意味だけでも良いので、ご存じの方、何卒ご教授のほど宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。