问题描述
根据N个数据点构造最小二乘多项式拟合。
输入形式
在屏幕上依次输入多项式的次数m,数据点的个数N,和N对数据点的x和y坐标。
输出形式
输出最小二乘多项式和误差。
样例输入
2
4
-3 3
0 1
2 1
4 3
样例输出
[ 0.17846248 -0.19249542 0.85051861]
0.2445252
样例说明
输入:多项式的次数m为2,有4对数据点,后续每行是一对数据点的x和y坐标。
输出:最小二乘多项式为y=0.17846248x**2-0.19249542x+0.85051861,误差(norm2范数,即欧式距离)为0.2445252(保留小数点后7位有效数字)
代码
# 最小二乘多项式拟合(曲线拟合)
import numpy as np
from numpy.linalg import inv, norm
def Input():
m = int(input())
n = int(input())
points = np.zeros((n, 2), dtype=np.double)
for each in range(n):
points[each, :] = np.array(input().split(), dtype=np.double)
return m, points[:, 0], points[:, 1]
def lspoly(X, Y, M):
n = len(X)
F = np.zeros((n, M + 1))
for k in range(0, M + 1):
F[:, k] = X ** k
A = np.transpose(F) @ F
B = np.transpose(F) @ Y
C = inv(A) @ B
return np.flipud(C)
def computeErr(X, Y, C):
F = np.poly1d(C)
# res = np.polyval(f, X)
# res = F(X)
return norm(F(X) - Y)
def output(x):
print(x)
def main():
M, X, Y = Input()
C = lspoly(X, Y, M)
err = computeErr(X, Y, C)
output(C)
output("%.7f" % err)
if __name__ == '__main__':
main()