【计算方法】曲线拟合——多项式拟合

计算方法 专栏收录该内容
12 篇文章 1 订阅

概述

给出n个数据点,并给定m个线性无关的函数f(x),则F(x)为几个f(x)的线性组合。抽象起来,其实在机器学习中相当于给n个训练样本,m个特征值,那么显然这里可以使用正规方程进行求解

正规方程推导过程

在这里插入图片描述

例题

【问题描述】根据N个数据点构造最小二乘多项式拟合。
【输入形式】在屏幕上依次输入多项式的次数m,数据点的个数N,和N对数据点的x和y坐标。
【输出形式】输出最小二乘多项式和误差。如果有多位小数,则保留6位有效数字。
【样例1输入】
2
4
-3 3
0 1
2 1
4 3
【样例1输出】
0.178462 -0.192495 0.850519
0.244525
【样例1说明】
输入:多项式的次数m为2,有4对数据点,后续每行是一对数据点的x和y坐标。
输出:最小二乘多项式为y=0.178462x**2-0.192495x+0.850519,误差(norm2范数,即欧式距离)为0.244525
【评分标准】根据输入得到的输出准确

ACcode:

'''
Author: your name
Date: 2021-05-14 11:57:28
LastEditTime: 2021-05-14 12:16:59
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \code_py\nihe_mul.py
'''
import numpy as np


def main():
    m = int(input())
    N = int(input())
    x = np.zeros([N, m+1], dtype=np.double)
    y = np.zeros(N, dtype=np.double)
    for i in range(N):
        x[i][0] = 1
        x[i][1], y[i] = list(map(float, input().split()))
    for i in range(N):
        for j in range(2, m+1):
            x[i][j] = x[i][j-1]*x[i][1]

    theta = np.linalg.inv((x.T@x))@x.T@y
    the = np.zeros(m+1, dtype=np.double)
    i = m
    while i >= 0:
        print('%g' % theta[i], end=' ')
        the[m-i] = theta[i]
        i -= 1
    print()

    err = 0.0
    for i in range(N):
        err += (np.polyval(the, x[i][1])-y[i])**2
    err = np.sqrt(err)
    print('%g' % err)


if __name__ == '__main__':
    main()

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值