2010年12月09日 星期四 08:04
x,y为1*6数组。
现在要将(x0,y0),(x1,y1)...(x5,y5)分别(共6次运算)去除,对其余5对数经行
leastsq运算,并以其余一组数为验证组。应该如何运用for语句?
2010年12月09日 星期四 08:20
请先把数据贴出来看看,然后说明一下具体的运算顺序。
分别去除是指什么?用什么函数对数据进行leastsq拟合?是直线么?
2010年12月09日 星期四 08:40
def residual(p):
for i in range(0,len(x)-1):
x1 = x[x!=x[i]]
y1 = y[y!=y[i]]
k, b, c = p
return y-(k*x+b)**2-c
大概就是这个意思。关键是把这个for放在哪?
我最后要对比6次插值,然后plot出来做对比。
2010年12月09日 星期四 09:12
# -*- coding: utf-8 -*-
import numpy as np
from scipy.optimize import leastsq
### 测试用数据 ###
k, b, c = 0.5, 0.2, 0.3
x = np.array([0.0, 0.1, 0.2, 0.3, 0.4, 0.5])
y = (k*x+b)**2+c + np.random.normal(size=len(x))*0.01
### 计算误差 ###
def residual(p, x, y):
k, b, c = p
return y - ((k*x+b)**2+c)
### 拟合 ###
def func(x, y, i):
""""从x,y中删除第i个元素之后进行拟合,并用第i个元素计算误差"""
x0, y0 = x[i], y[i]
xp = np.delete(x, i)
yp = np.delete(y, i)
plsq = leastsq(residual, [1,1,1], args=(xp, yp))
return plsq[0], residual(plsq[0], x0, y0)
### 绘图 ###
import pylab as pl
px = np.arange(0,1,0.01)
pl.plot(x, y, "o")
for i in xrange(len(x)):
p, error = func(x, y, i)
k,b,c = p
py = (k*px+b)**2+c
pl.plot(px, py, label="%d:%f" % (i, error))
pl.legend()
pl.show()
2010年12月09日 星期四 09:30
这里贴程序不太方便,我放到下面的地址了:
2010年12月09日 星期四 09:39
谢谢张老师!
还是没有很好的把握住问题,才会出现如此低级的失误。。
Zeuux © 2024
京ICP备05028076号