生成免费的 运行 失效率和心理曲线拟合猜测率列表 (Scipy)
Generation of free running list of lapse rate and guess rate for psychometric curve fitting (Scipy)
作为 scipy 曲线拟合函数的新用户和 python 的相对新用户,我对 *popt 和 p0 究竟生成什么感到有点困惑(参考this)
所以我试图在这里根据自定义的 S 型函数公式绘制心理测量拟合,该公式说明了猜测和失误率(两者的值都在 0 和 1 之间,以说明实验中参与者的猜测和表现失误率。这些值将分别定义曲线拟合下端和上端的拟合。)
当在函数外部设置固定猜测率时,我可以获得生成适合曲线的最佳失效率的函数。但是当我想让函数同时生成最佳失效率和猜测率时,它不能,并给出了以下错误:-
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)
现在我知道这意味着 'guess rate' 变量没有值,因此出现此错误。那么函数如何能够生成 'lapse rate' 而不是 'guess rate' 呢?
猜测率为前缀值且曲线拟合成功时的代码如下:-
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()
而当我试图让公式尝试找到最佳 'guess' 值时,它做不到。 (这里,'guess = 0.05 #Set the minimum chance level' 被移除,并且在 sigmoid 函数中插入了一个猜测变量。):-
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()
p0
是拟合过程的起点。 popt
是参数的最佳拟合值。
请注意,curve_fit
假定函数的签名 f(x, *parameters)
:第一个参数是一个自变量,您有 xdata
,其余参数是您想要优化。
在您的第一个示例中,sigmoidscaled
有四个参数,您为 p0
提供了一个长度为三的列表。这样,拟合以 x0 = 1; k = 1; lapse = -10
.
开始
在您的第二个示例中,sigmoidscaled
有五个参数,这意味着您要拟合四个需要初始值的参数。
快速检查:
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])
作为 scipy 曲线拟合函数的新用户和 python 的相对新用户,我对 *popt 和 p0 究竟生成什么感到有点困惑(参考this)
所以我试图在这里根据自定义的 S 型函数公式绘制心理测量拟合,该公式说明了猜测和失误率(两者的值都在 0 和 1 之间,以说明实验中参与者的猜测和表现失误率。这些值将分别定义曲线拟合下端和上端的拟合。)
当在函数外部设置固定猜测率时,我可以获得生成适合曲线的最佳失效率的函数。但是当我想让函数同时生成最佳失效率和猜测率时,它不能,并给出了以下错误:-
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)
现在我知道这意味着 'guess rate' 变量没有值,因此出现此错误。那么函数如何能够生成 'lapse rate' 而不是 'guess rate' 呢?
猜测率为前缀值且曲线拟合成功时的代码如下:-
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()
而当我试图让公式尝试找到最佳 'guess' 值时,它做不到。 (这里,'guess = 0.05 #Set the minimum chance level' 被移除,并且在 sigmoid 函数中插入了一个猜测变量。):-
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()
p0
是拟合过程的起点。 popt
是参数的最佳拟合值。
请注意,curve_fit
假定函数的签名 f(x, *parameters)
:第一个参数是一个自变量,您有 xdata
,其余参数是您想要优化。
在您的第一个示例中,sigmoidscaled
有四个参数,您为 p0
提供了一个长度为三的列表。这样,拟合以 x0 = 1; k = 1; lapse = -10
.
在您的第二个示例中,sigmoidscaled
有五个参数,这意味着您要拟合四个需要初始值的参数。
快速检查:
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])