《统计学习方法》+最小二乘拟合多项式系数推导过程+P12推导勘误

    《统计学习方法》在第十二页的求拟合多项式系数时,推出的结果与书本的不一致。在网上搜了《统计学习方法》勘误(http://blog.sina.com.cn/s/blog_7ad48fee01017dpi.html),结果还是错误的,也有一些人提出疑惑,但是李航博士也没有解答。本文试图推导最小二乘拟合多项式的过程,对书本的结果进行勘误,并且用向量的形式进行推导验证结果的正确性。

    首先,原问题:


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是C语言实现最小二乘拟合多项式的代码: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAXN 100 int n; // 数据点个数 double x[MAXN], y[MAXN]; // 数据点坐标 int m; // 拟合多项式的最高次数 double a[MAXN]; // 多项式系数 void input() { printf("请输入数据点个数n:"); scanf("%d", &n); printf("请输入数据点坐标:\n"); for (int i = 0; i < n; i++) { printf("x[%d] = ", i); scanf("%lf", &x[i]); printf("y[%d] = ", i); scanf("%lf", &y[i]); } printf("请输入拟合多项式的最高次数m:"); scanf("%d", &m); } void fit() { double s[MAXN][MAXN], t[MAXN]; for (int i = 0; i <= m; i++) { for (int j = 0; j <= m; j++) { s[i][j] = 0.0; for (int k = 0; k < n; k++) { s[i][j] += pow(x[k], i+j); } } t[i] = 0.0; for (int k = 0; k < n; k++) { t[i] += y[k] * pow(x[k], i); } } for (int i = 0; i <= m; i++) { for (int j = i+1; j <= m; j++) { double r = s[j][i] / s[i][i]; for (int k = i; k <= m; k++) { s[j][k] -= r * s[i][k]; } t[j] -= r * t[i]; } } for (int i = m; i >= 0; i--) { for (int j = i+1; j <= m; j++) { t[i] -= s[i][j] * a[j]; } a[i] = t[i] / s[i][i]; } } void output() { printf("拟合多项式为:\n"); for (int i = m; i >= 0; i--) { if (i == m) { printf("%.2lf * x^%d", a[i], i); } else if (i == 0) { if (a[i] >= 0) { printf(" + %.2lf", a[i]); } else { printf(" - %.2lf", -a[i]); } } else { if (a[i] >= 0) { printf(" + %.2lf * x^%d", a[i], i); } else { printf(" - %.2lf * x^%d", -a[i], i); } } } printf("\n"); } int main() { input(); fit(); output(); return 0; } ``` 该程序通过输入数据点的坐标和拟合多项式的最高次数,使用最小二乘法求解多项式系数,并输出拟合多项式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值