2016-05-05 3 views
0

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() 

答えて

0
p0

フィット手順の出発点です。 poptは、結果として得られたパラメータの最適値です。

f(x, *parameters)の場合、関数のシグネチャは、最初の引数がxdataの独立変数であり、残りが最適化するパラメータであることを前提としています。

最初の例では、sigmoidscaledは4つの引数をとり、p0の長さ3のリストを指定します。このようにして、フィッティングはx0 = 1; k = 1; lapse = -10で始まります。

2番目の例では、sigmoidscaledは5つの引数をとります。つまり、初期値が必要な4つのパラメータを指定しています。

クイックチェック:

In [22]: p0 = [1, 1, -10, 0] # add the 4th element 

In [23]: popt, pcov = curve_fit(sigmoidscaled, xdata, ydata, p0, maxfev = 3000) 

In [24]: popt 
Out[24]: array([ -1.97865387e+01, 3.31731590e-01, -1.03275740e-01, 
     -1.05595226e+03]) 
+0

ああ右感謝!ちょうどもう1つの質問 - 私は経過率と推測率の値を0と1の間の値(つまり、p0の3番目と4番目の要素)に制限する必要があるので、何とかこの条件を指定する方法はありますか? –

+0

はい、SciPy 0.17以上を使用している場合は、 'bounds'引数のドキュメントを参照してください –

関連する問題