生成免费的 运行 失效率和心理曲线拟合猜测率列表 (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])