Python中最小二乘法的问题

Python中最小二乘法的问题,python,numpy,least-squares,Python,Numpy,Least Squares,我正在做一个项目,分析数据,并试图使用最小二乘法(内置)来做到这一点。我找到了一个教程,其中提供了代码作为示例,效果很好: x = arange(0, 6e-2, 6e-2/30) A, k, theta = 10, 1.0/3e-2, pi/6 y_true = A*sin(2*pi*k*x+theta) y_meas = y_true+2*random.randn(len(x)) def residuals(p, y, x): A, k, theta = p print "

我正在做一个项目,分析数据,并试图使用最小二乘法(内置)来做到这一点。我找到了一个教程,其中提供了代码作为示例,效果很好:

x = arange(0, 6e-2, 6e-2/30)
A, k, theta = 10, 1.0/3e-2, pi/6
y_true = A*sin(2*pi*k*x+theta)
y_meas = y_true+2*random.randn(len(x))

def residuals(p, y, x):
    A, k, theta = p
    print "A type" + str(type(A))
    print "k type" + str(type(k))
    print "theta type" + str(type(theta))
    print "x type" + str(type(x))
    err = y - A*sin(2*pi*k*x+theta)
    return err

def peval(x, p):
    return p[0]*sin(2*pi*p[1]*x+p[2])

p0 = [8,1/2.3e-2,pi/3]

plsq = leastsq(residuals, p0, args=(y_meas, x))
print(plsq[0])
但是,当我尝试将其传输到自己的代码时,它会不断抛出错误。我在这方面已经工作了一段时间,我想,我已经设法消除了早期困扰我的所有类型不匹配问题。据我所知,目前这两段代码几乎相同,但我得到了错误 “不支持的操作数类型”,无法确定下一步要做什么。以下是我的代码中与此问题有关的部分我的代码:

if (ls is not None):
        from scipy.optimize import leastsq
        p0 = [8, 1/2.3e-2,pi/3]
        def residuals(p, y, x):
            A,k,theta = p
            if (type(x) is list):
                x = asarray(x)
            err = y - A*sin(2*pi*k*x+theta) #Point of error
            return err
        def peval(x, p):
            return p[0]*sin(2*pi*p[1]*x+p[2])
        plsq = leastsq(residuals, p0, args=(listRelativeCount, listTime))
        plsq_0 = peval(listTime, plsq[0])

其中listTime是在listRelativeCount中找到的数据的x值。我已经标记了代码当前失败的行。任何帮助都将不胜感激,因为我已经在这个问题上纠缠了一个多月。

在您调用的
#错误点
行中发生了三件事:您正在乘以值,添加值并应用
sin()
函数。“不支持的操作数类型”表示其中一个操作出错。这意味着您需要验证操作数的类型,并确保您知道应用了什么函数

  • 您确定知道所有操作数的类型(以及
    ndarray
    s的
    dtype
    s),包括
    pi
    x
    theta
    A
  • 您确定正在使用哪个
    sin
    函数吗
    math.sin
    np.sin
    不同,它们接受不同的操作数
  • 将一个列表乘以一个标量(如果您的
    listTime
    变量实际上是一个列表)与将标量和
    ndarray相乘完全不同
如果不清楚是哪个操作导致了错误,请尝试分解表达式:

err1 = 2*pi*k
err2 = err1*x
err3 = err2 +  theta
err4 = sin(err3)
err5 = A*err4
err = y - err5
这应该澄清什么操作引发异常


这是一个例子,说明了为什么使用显式的包名,比如
np.sin()
,而不是
sin()

listRelativeCount
列表吗?你能包含完整的回溯吗?你能给出
残差的示例数据吗,
listRelativeCount
listTime
?我已经检查了我正在使用的所有数据的类型,x是一个数组,您看到的所有其他数据都是一个numpy.float64。我已重试代码,确保显式使用numpy sin,但仍然得到相同的结果。回溯内容为:回溯(最近一次调用last):文件“C:\Users\~~~~~~~~~~~~~~”,第66行,在残差err=y-Anp.sin(2*pik*x+theta)TypeError中:不支持*的操作数类型:'numpy.float64'和'numpy.ndarray'的长度编辑下一步我会尝试,因为您有错误的行号,将表达式分解为单个操作表达式,并查看哪一行产生错误。我将相应地编辑答案。我将其分解为单独的表达式,它不喜欢用x(n数组)乘以k(一个numpy.float64,但让我困惑的是,示例中没有出现相同的错误,我看不出它们之间有什么区别。在我看来,示例似乎是在为x中的每个值重新计算err。下一步我要查看的是检查
x
k
的范围。当您检查
类型(k)时
,例如,它可能与函数相乘的内容不同。可以尝试两件简单的事情:尝试更改变量的名称,或尝试显式
全局
声明(如果您打算这样管理变量).我将所有变量设置为全局变量,就像示例中一样,并将相关函数移到主函数之外,以便它们也具有全局范围。我仍然会得到相同的错误。