Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用curvefit拟合双曲调和函数_Python_Scipy - Fatal编程技术网

Python 用curvefit拟合双曲调和函数

Python 用curvefit拟合双曲调和函数,python,scipy,Python,Scipy,我在使用curvefit函数时遇到问题。 这里我有一个代码,有两个函数可以使用。 第一个是双曲函数。 第二个参数相同,但有一个参数=1。 我的问题是,用curvefit拟合第一个函数的结果很好,但用第二个函数拟合的结果却不好。 我有一个商业计划,分别为两者生成正确的解决方案。因此,有可能找到第二个函数的解决方案(我前面提到的第一个函数的特殊情况) 有没有人能告诉我我做错了什么? 谢谢 以下是要运行的代码: def hypRegress(ptp,pir): xData = np.aran

我在使用curvefit函数时遇到问题。 这里我有一个代码,有两个函数可以使用。 第一个是双曲函数。 第二个参数相同,但有一个参数=1。 我的问题是,用curvefit拟合第一个函数的结果很好,但用第二个函数拟合的结果却不好。 我有一个商业计划,分别为两者生成正确的解决方案。因此,有可能找到第二个函数的解决方案(我前面提到的第一个函数的特殊情况) 有没有人能告诉我我做错了什么? 谢谢

以下是要运行的代码:

def hypRegress(ptp,pir):

    xData = np.arange(len(ptp))
    yData = pir

    xData = np.array(xData, dtype=float)
    yData = np.array(yData, dtype= float)

    def funcHyp(x, qi, exp, di):
        return qi*(1+exp*di*x)**(-1/exp)

    def errfuncHyp(p):
        return funcHyp(xData, p[0], p[1], p[2]) - yData

    #print(xData.min(), xData.max())
    #print(yData.min(), yData.max())

    trialX = np.linspace(xData[0], xData[-1], 1000)



    # Fit an hyperbolic
    popt, pcov = optimize.curve_fit(funcHyp, xData, yData)
    print 'popt'
    #print(popt)
    yHYP = funcHyp(trialX, *popt)

    #optimization

    # initial values
    p1, success = optimize.leastsq(errfuncHyp, popt,maxfev=10000)
    print p1

    aaaa = funcHyp(trialX, *p1)

    plt.figure()
    plt.plot(xData, yData, 'r+', label='Data', marker='o')
    plt.plot(trialX, yHYP, 'r-',ls='--', label="Hyp Fit")
    plt.plot(trialX, aaaa, 'y', label = 'Optimized')
    plt.legend()
    plt.show(block=False)
    return p1


def harRegress(ptp,pir):

    xData = np.arange(len(ptp))
    yData = pir

    xData = np.array(xData, dtype=float)
    yData = np.array(yData, dtype=float)

    def funcHar(x, qi, di):
        return qi*(1+di*x)**(-1)

    def errfuncHar(p):
        return funcHar(xData, p[0], p[1]) - yData

    #print(xData.min(), xData.max())
    #print(yData.min(), yData.max())

    trialX = np.linspace(xData[0], xData[-1], 1000)



    # Fit an harmonic
    popt, pcov = optimize.curve_fit(funcHar, xData, yData)
    print 'popt'
    print(popt)
    yHAR = funcHar(trialX, *popt)

    #optimization

    # initial values
    p1, success = optimize.leastsq(errfuncHar, popt,maxfev=1000)
    print p1

    aaaa = funcHar(trialX, *p1)

    plt.figure()
    plt.plot(xData, yData, 'r+', label='Data', marker='o')
    plt.plot(trialX, yHAR, 'r-',ls='--', label="Har Fit")
    plt.plot(trialX, aaaa, 'y', label = 'Optimized')
    plt.legend()
    plt.show(block=False)
    return p1


ptp = ([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])
pir = ([150,85,90,50,45,60,60,40,40,30,28,30,38,30,26])

hypRegress(ptp,pir)
harRegress(ptp,pir)

input('pause')

这是一个典型的问题。
curve\u-fit
算法从要优化的参数的初始猜测开始,如果没有提供,它就是所有参数

也就是说,当你打电话的时候

popt, pcov = optimize.curve_fit(funcHar, xData, yData)
安装程序的第一次尝试是假设

funcHar(xData, qi=1, di=1)
如果未指定任何其他选项,拟合将很差,这可以从参数估计值的较大差异中看出(检查
pcov
的对角线,并将其与
popt
中返回的实际值进行比较)

在许多情况下,通过提供智能猜测解决了这种情况。根据您的HAR模型,我推断
x==0
周围的值与
qi
大小相同。因此,您可以提供
p0=(pir[0],1)
的初始猜测,这将导致一个令人满意的解决方案。你也可以称之为

popt, pcov = optimize.curve_fit(funcHar, ptp, pir, p0=(0, 1))
这导致了同样的结果。所以问题在于算法找到了一个局部极小值

另一种选择是提供一个不同的
系数
,即“确定初始步界的参数”:

在这种情况下,即使(默认)初始猜测为
p0=(1,1)
,它也会给出相同的结果拟合

记住:装修是一门艺术,而不是一门科学。通常情况下,通过分析您想要拟合的模型,您可以提供一个良好的初始猜测


我不能为商业程序中使用的算法辩护。如果是开源的(不太可能),你可以看看他们做了什么。

非常感谢Oliver!你的回答很清楚,很有用!
popt, pcov = optimize.curve_fit(funcHar, ptp, pir, p0=(1, 1), factor=1)