scipyと比較的新しいPythonユーザーからのカーブフィッティング関数の新しいユーザーとして、私は* popt p0が正確に生成されます(thisを参照)Psychometric Curveフィッティングのための失速率と推測率のフリーランニングリストの生成(Scipy)
ここでは、推測と失効率を考慮したカスタマイズされたシグモイド関数式に基づいて心理測定フィッティングをプロットしようとしています(両方とも0と1の間の値を考慮してください)。参加者の推測とパフォーマンスの低下率は、それぞれ曲線のフィットの下端と上端のフィットを定義します。
fu関数の外に固定の推測率が設定されたときに最適な失速率を生成することができました。しかし、私は、関数が最高の減率の両方を生成し、レートを推測したい場合、それができなかった、と次のエラーました: -
File "C:\Users\Aaron\Anaconda2\lib\site-packages\scipy\optimize\minpack.py", line 447, in _general_function return function(xdata, params) - ydata TypeError: sigmoidscaled() takes exactly 5 arguments (4 given)
を今、私はこれはから来る何の価値がなかったことを意味していることを認識しています'推測率'変数、したがってこのエラーです。それでは、この関数は「経過率」を生成することができましたが、ここでは「推測率」を生成できませんでしたか?
これらは推測率がプレフィックス値であり、曲線フィットが成功したときにコードされている: -
import numpy as np
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])
guess = 0.05 #Set the minimum chance level
#The scaled sigmoid function
def sigmoidscaled(x, x0, k, lapse):
F = (1 + np.exp(-k*(x-x0)))
z = guess + (1-guess-lapse)/F
return z
p0=[1,1,-10]
popt, pcov = curve_fit(sigmoidscaled, xdata, ydata, p0, maxfev = 3000)
#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()
私は式は最高の「推測」値を見つけるために試してみることを試みたときには、それできなかった。 (ここで、除去された「= 0.05 #SET最小チャンスレベルが推測」及びシグモイド関数に挿入推測変数): -
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,-10]
popt, pcov = curve_fit(sigmoidscaled, xdata, ydata, p0, maxfev = 3000)
#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()
ああ右感謝!ちょうどもう1つの質問 - 私は経過率と推測率の値を0と1の間の値(つまり、p0の3番目と4番目の要素)に制限する必要があるので、何とかこの条件を指定する方法はありますか? –
はい、SciPy 0.17以上を使用している場合は、 'bounds'引数のドキュメントを参照してください –