我需要用直线拟合不同数据集中的一些点。从每个数据集中,我想要适合一条线。所以我得到了描述i线的参数ai和bi:ai + bi * x。问题是我想强制每个AI都是平等的,因为我需要相同的intercepta。我在这里找到了一个教程:http://www.scipy.org/Cookbook/FittingData#head-a44b49d57cf0165300f765e8f1b011876776502f。不同的是,我不知道我有多少数据集。我的代码是这样的:scipy智能优化
from numpy import *
from scipy import optimize
# here I have 3 dataset, but in general I don't know how many dataset are they
ypoints = [array([0, 2.1, 2.4]), # first dataset, 3 points
array([0.1, 2.1, 2.9]), # second dataset
array([-0.1, 1.4])] # only 2 points
xpoints = [array([0, 2, 2.5]), # first dataset
array([0, 2, 3]), # second, also x coordinates are different
array([0, 1.5])] # the first coordinate is always 0
fitfunc = lambda a, b, x: a + b * x
errfunc = lambda p, xs, ys: array([ yi - fitfunc(p[0], p[i+1], xi)
for i, (xi,yi) in enumerate(zip(xs, ys)) ])
p_arrays = [r_[0.]] * len(xpoints)
pinit = r_[[ypoints[0][0]] + p_arrays]
fit_parameters, success = optimize.leastsq(errfunc, pinit, args = (xpoints, ypoints))
我
Traceback (most recent call last):
File "prova.py", line 19, in <module>
fit_parameters, success = optimize.leastsq(errfunc, pinit, args = (xpoints, ypoints))
File "/usr/lib64/python2.6/site-packages/scipy/optimize/minpack.py", line 266, in leastsq
m = check_func(func,x0,args,n)[0]
File "/usr/lib64/python2.6/site-packages/scipy/optimize/minpack.py", line 12, in check_func
res = atleast_1d(thefunc(*((x0[:numinputs],)+args)))
File "prova.py", line 14, in <lambda>
for i, (xi,yi) in enumerate(zip(xs, ys)) ])
ValueError: setting an array element with a sequence.
谢谢,我喜欢它。问题是现在我需要使用错误,我的意思是:y点有错误,我需要用1 /错误^ 2加权。我怎样才能用你的代码做到这一点? – 2010-06-28 18:31:38
最好的方法是使用scikits.statsmodels,因为在这种情况下,所有的预测,预测和结果统计都是预制的。 http://pypi.python.org/pypi/scikits.statsmodels/0.2.0和链接 获得预测的y PARAMS = np.dot(np.linalg.pinv(x)中,ypoints中) ypred = np.dot(x,params) errors = ypoints - ypred ... 如果您是指称误差,使用加权最小二乘法,那么x和y点都需要除以误差标准差,或者使用scikits.statsmodels中的WLS类。 – user333700 2010-06-28 22:15:58