Python和科学计算认证群组  - 讨论区

标题:最小二乘法问题

2011年09月30日 星期五 21:05

感谢!!!!!!

2011年10月01日 星期六 18:15

我觉得你没有搞清楚leastsq所调用的residual函数的作用。你再好好对照一下书中的实例:

http://hyry.dip.jp:8000/scipybook/default/file/03-scipy/scipy_least_square_sin.py

2011年10月04日 星期二 15:51

这个例子看过很多遍,但是遇到新的例子总是拿不准 args=()中的参数,希望斑竹多加指点,感谢先!

2011年10月04日 星期二 16:45

leastsq()的args参数是传递给residual()的额外参数, residual()的第一个参数是待定系数列表,其后的参数就是leastsq()的args参数。

如果你对这种参数传递不熟悉的话,那么最好不用它。在residual()中直接访问全局变量即可。

2011年10月04日 星期二 20:32

 

import numpy as np

from scipy.optimize import leastsq

import pylab as pl

Ref = np.arange(0,10,0.1)

def func(x,p):

    A1,A2,A3,A4 = p

    Linear = A1*Ref

    Poly = A2+A3*x+A4*x**2

    return Linear+Poly

def residual(p, y, x):

    return y - func(x,p)

noise = np.random.randn(len(Ref))

Exp = Ref*5.0 + noise 

n = len(Ref)

x = np.linspace(1, n, n)

p0 = [5.0, 0, 0, 0 ]

y0 = func(x,p0)

plsq = leastsq(residual, p0, args=(Exp, x))

pl.figure()

pl.plot(x, y0, label="Original")

pl.plot(x, func(x, plsq[0]), label="Best Fit")

pl.legend()

版主看了你的说明问题解决了,如果多项式阶数越高系数越多就比较麻烦了。请教斑竹如何把def func() 中的Poly 改成多项式阶数可变的形式,我的想法如下

def func(x,p):

    A1,Coeff,deg = p    

    Coeff = np.polyfit(x, Ref, deg)

    Fity = np.polyval(Coeff, x)

    return A1*Ref+Fity

但是定义初始值时 p0 = [1.93, Coeff0, deg],错误 ValueError: setting an array element with a sequence.

 

2011年10月05日 星期三 12:27

我觉得你只需要用np.polyval()就可以了。用np.polyval([A4, A3, A2], x)可以快速计算:

A2+A3*x+A4*x**2

所以func可以写为:

def func(x,p):

    return np.polyval(p[:0:-1], x) + p[0]*Ref

你如果用了polyfit的话,那就不需要再用leastsq了吧。

 

2011年10月05日 星期三 19:38

斑竹说的正是我所需要的,但是我提到的polyfit就是想省去 定义多项式阶数的麻烦,直接用degree=n就能实现想要的高阶多项式。按你的思路,比如: 

def func(x,p):

    A1,A2,A3,A4,A5,A6,A7,A8,A9,A10 = p # 能否简化此定义,类似degree=n直接指定阶数???

    return np.polyval(p[:0:-1], x) + p[0]*Ref

 

2011年10月05日 星期三 19:54

没明白什么意思,你不需要运行A1,A2,...,A10 = p 啊。

2011年10月05日 星期三 23:37

我明白np.polyval(p[:0:-1], x) 的意思了, 十分感谢斑竹!!!!!!!!!!!!!!

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号