【发布时间】:2021-02-19 05:42:51
【问题描述】:
我目前正在尝试使用 jupyter 进行多项式拟合。给定 xs 中对应 ys 的数据点,下面的函数返回 m 次最小二乘多项式。
from numpy import *
from matplotlib import pyplot as plt
def findas(m,xs,ys):
A = array([[0]*(m+1)]*(m+1))
b = array([0]*(m+1))
for k in range(m+1):
b[k] = sum(ys*xs**k)
for i in range(m+1):
A[k,i] = sum(xs**(k+i))
coefs = linalg.solve(A,b)
print(coefs)
def fit(x):
return sum(coefs*(x**array(range(len(coefs)))))
return fit
假设我有以下六个数据点并拟合一个 5 次多项式:
xs = array([1,2,3,4,5,6])
ys = array([-5.21659 ,2.53152 ,2.05687 ,14.1135 ,20.9673 ,33.5652])
ft = findas(5,xs,ys)
据我了解,生成的曲线应该准确地通过每个数据点(实际上,结果应该是拉格朗日多项式)。
xdense = arange(1,6.1,0.1)
ydense = [ft(x) for x in xdense]
plt.plot(xdense,ydense)
plt.plot(xs,ys,'rx')
plt.show()
样本输出:
但是,事实并非如此。曲线离得很远!这里发生了什么?这与舍入误差有关吗?提前致谢!
【问题讨论】:
-
@Mr.T 现在好点了吗?抱歉,不要用这么多。
-
@Mr.T 真的很抱歉!我只是注意到粘贴代码时所有标识都消失了!是的,我正在使用 numpy,并且我已经进行了上面的编辑。
-
这很可能是 chi^2 中的局部最小值...拟合是局部优化而不是全局优化
-
@mikuszefski 这是有道理的。假设样本点后面的“真实”函数为 f(x) = 3x+2,假设样本点数为 n,回归多项式的次数为 N。如果 n=N>=1,这样的局部-但某些 N 仍会出现非全局最小值?
-
等等...我有点糊涂了。这是完全线性的,因此最坏的情况可能比问题条件严重的点更高。
标签: python regression curve-fitting polynomials data-fitting