【问题标题】:scipy curve_fit returning initial parameter estimatesscipy curve_fit 返回初始参数估计
【发布时间】:2013-07-30 23:54:16
【问题描述】:

我正在尝试使用 scipy curve_fit 将高斯函数拟合到我的数据中,网络上有许多有用的示例,我试图让几个工作,但无济于事。我使用虚构的数据编写了一个简单的脚本来诊断问题。简而言之,curve_fit 没有进行任何拟合,该函数只是返回初始参数值,无论它们与实数有多接近。这是简单脚本的代码:

# -*- coding: utf-8 -*-
import numpy
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
from scipy import optimize

##Fit
def Fit( datax, datay ):    
    # define your function:
    def f(x, *p): 
        p = m, b     
        return m*numpy.asarray(x) + b
    m = 0.4
    b = 2.4
    p_init = [m, b]
    Initial_model = f(datax, [m, b])    
    plt.plot(datax, Initial_model, label='Initial Model')
    plt.title("Initial Model")
#    plt.title('Initial Model')
#    plt.show()
   # fit! (given that data is an array with the data to fit)
    print optimize.curve_fit(f, datax, datay, p_init)
    coeff, var_matrix = optimize.curve_fit(f, datax, datay, p_init)
    global fit
    fit = f(datax, *coeff)
    plt.plot(datax, fit, 'r-')
    plt.show()
    print 'Fitted slope 1 = ', coeff[0]
    print 'Fitted intercept 1 = ', coeff[1]
    return fit

##Plot
def Plot( datax, datay, fit ):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    plt.plot(datax, datay, 'b*')
    l = ax.plot( datax, fit, 'r-', linewidth=2)
    ax.set_xlabel('Rate')
    ax.set_ylabel('Return')
    ax.set_title("Test")
    ax.autoscale(enable=True, axis='both', tight=None)
    ax.grid(True)
    plt.show()

##data
datax = numpy.array([7.02, 20.06, 13.78, 16.92, 10.17], dtype=numpy.float64)
datay = numpy.array([5.14, 10.66, 8.44, 9.64, 6.79], dtype=numpy.float64)

##analyze
Fit( datax, datay )
Plot( datax, datay, fit )

Out:
(array([ 0.4,  2.4]), inf)
Fitted slope 1 =  0.4
Fitted intercept 1 =  2.4

我尝试过的事情: - 直接使用 leastsq:同样的问题 - 重新安装 scipy:没有变化

我在 Windows 7 上使用 Anaconda。

可能是什么问题?

【问题讨论】:

  • 发生了什么是您在数据中添加噪声并更改初始猜测,使其不再与实际参数相同?

标签: python-2.7 scipy curve-fitting


【解决方案1】:

您对f() 的定义很奇特,没有做您想做的事。您将 mb 分配给 p 从而覆盖传入的任何内容。这就是为什么参数似乎永远不会改变,因为它们不会改变!

没有必要以特殊的方式定义f(),只需按照您通常会列出参数的方式来定义它。对于您拟合线的简单情况,我们可以使用

def f(x, m, b) :
    return m*x + b

唯一需要的其他更改是

Initial_model = f(datax, *p_init)

您的代码将运行。

【讨论】:

    猜你喜欢
    • 2014-07-12
    • 1970-01-01
    • 2018-10-26
    • 2015-04-26
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多