web-dev-qa-db-ja.com

Curve_fit(scipy)中に特定の変数に境界を適用すると、エラーが発生します

カーブフィッティング中にいくつかのパラメータに境界を適用しようとしていますが、そうしようとすると次のエラーメッセージが表示されます。

ValueError:解凍するには値が多すぎます

バインドされたコマンドの各2-タプルは、私の場合、それぞれx0、k、lapse、sigmoidscaled関数の推測に対応していませんか(つまり、p0にも対応しています)?

次に、バインドされたコマンドを次のように減らして「値が多すぎます」を削除することで、どのように機能するかを理解しようと試みました。

bounds =((-np.inf、np.inf)、(0,1))

次に、次のエラーメッセージが表示されます。

ValueError:境界とx0の間の形状に一貫性がありません。

ここで何が間違っているのですか?

import pylab
from scipy.optimize import curve_fit
from matplotlib.pyplot import *

n = 20 #20 trials
ydata = [0/n, 9.0/n, 9.0/n, 14.0/n, 17.0/n] #Divided by n to fit to a plot of y =1
xdata = np.array([ 1.0, 2.0, 3.0, 4.0, 5.0])


#The scaled sigmoid function
def sigmoidscaled(x, x0, k, lapse, guess):
    F = (1 + np.exp(-k*(x-x0))) 
    z = guess + (1-guess-lapse)/F
    return z

p0=[1,1,0,0] 
popt, pcov = curve_fit(sigmoidscaled, xdata, ydata, p0, bounds=((-np.inf,np.inf), (-np.inf,np.inf), (0,1), (0,1))

#Start and End of x-axis, in spaces of n. The higher the n, the smoother the curve.
x = np.linspace(1,5,20)
#The sigmoid values along the y-axis, generated in relation to the x values and the 50% point.
y = sigmoidscaled(x, *popt)

pylab.plot(xdata, ydata, 'o', label='Psychometric Raw', color = 'blue')
pylab.plot(x,y, label='Psychometric Fit', color = 'blue')
#y axis range.
pylab.ylim(0, 1)
#Replace x-axis numbers as labels and y-axis numbers as percentage
xticks([1., 2., 3., 4., 5.], ['C1','CN2','N3','CN4','S5'])
yticks([0.0, 0.2, 0.4, 0.6, 0.8, 1.0], ['0%','20%','40%','60%','80%','100%'])
pylab.legend(loc='best')
xlabel('Conditions')
ylabel('% perceived more sin like')
pylab.show() 
6

問題の行は次のとおりです。

popt, pcov = curve_fit(sigmoidscaled, xdata, ydata, p0, bounds=((-np.inf,np.inf), (-np.inf,np.inf), (0,1), (0,1))

documentation から、boundsは配列のいいねの2タプルである必要があります。したがって、各ポイントの下限と上限を指定する代わりに、次のように、最初の配列のように各ポイントの下限を指定し、次に2番目の配列のように各ポイントの上限を指定する必要があります。

popt, pcov = curve_fit(sigmoidscaled, xdata, ydata, p0, bounds=((-np.inf, -np.inf, 0, 0), (np.inf, np.inf, 1, 1)))

この変更の後、プロットがすぐに現れました!

8