一元多项式回归

一元多项式回归设拟合多项式为 m x 残差平方和用最小二乘来确定系数 a0 a1 am 设残差平方和 Q 对 ak 求偏导数 并令其等于零 有写成矩阵形式为 上面的方程是解别人的图 原址奉上 https www cnblogs com 144823836yj p 5524610 html 接下来就是解线性方程组增广矩阵法由于需要构造系数为 1 将进行大量浮点运算 况且矩阵的元素肯能很大

设拟合多项式为φm(x)

在这里插入图片描述

残差平方和

增广矩阵法

由于需要构造系数为1,将进行大量浮点运算,况且矩阵的元素肯能很大,会出现大吃小的可能,会引入大量误差

逆矩阵法

在这里插入图片描述
依旧计算量相当大,浮点运算误差影响更大

R代码

三次多项式拟合

x=matrix(c(5.0, 15.0, 55.0, 225.0 , 15.0, 55.0, 225.0, 979.0 , 55.0, 225.0, 979.0, 4425.0, 225.0, 979.0, 4425.0, 20515.0 ), nr=4,nc=4) b=matrix(c(15.0, 56.0, 231.0 ,1007.0 ),nr=4,nc=1) c=solve(x)%*%b a=matrix(c(1.5,-1,0.5),nr=3,nc=1) > c [,1] [1,] 2. [2,] -2. [3,] 1. [4,] -0. 

针对对称矩阵有LDLT分解法(LT为L的转置)

在这里插入图片描述

java代码

public class CurveFit { 
    public static void main(String[] args) { 
    double[] x=new double[] { 
   1,2,3,4,5}; double[] y=new double[] { 
   1,1.5,3,4.5,5}; show(curveFit(x,y,3)); } public static double [] curveFit(double[] x,double[] y,int pow) { 
    double[][] matrix=createMatrix(x,y,pow); LDLTDCMP(matrix); double [] xy=iteration(y,x,pow+1); LDLTBKSB(matrix,xy); return xy; } public static double[][] createMatrix(double[] x,double[] y,int pow) { 
    double [] xx=iteration(x,x,2*pow); double[][] matrix=new double[pow+1][pow+1]; matrix[0][0]=x.length; for(int i=0;i<pow+1;i++) { 
    for(int k=0;k<pow+1;k++) { 
    if(i+k>0) { 
    matrix[i][k]=xx[i+k-1]; } } } return matrix; } public static double[] iteration(double[] start,double [] value,int count) { 
    double[] itr = null; double[] ret = new double [count]; for(int i=0;i<count;i++) { 
    if(i==0) { 
    itr=start.clone(); }else { 
    itr=mul(itr,value); } ret[i]=sum(itr); } return ret; } public static double[] mul(double[] a,double[] b) { 
    double[] c=a.clone(); if(a.length==b.length) { 
    for(int i=0;i<a.length;i++) { 
    c[i]*=b[i]; } } return c; } public static double sum(double[] a) { 
    double ret=0; for(int i=0;i<a.length;i++) { 
    ret+=a[i]; } return ret; } public static void LDLTDCMP ( double [][]a) { 
    int k=0,m=0,i=0,n=a.length; for (k = 0; k < n; k++) { 
    for (m = 0; m < k; m++) { 
    a[k][k] = a[k][k] - a[m][k] * a[k][m]; } if (a[k][k] == 0) { 
    return; } for (i = k + 1; i < n; i++) { 
    for (m = 0; m < k; m++) a[k][i] = a[k][i] - a[m][i] * a[k][m]; a[i][k] = a[k][i] / a[k][k]; } } } public static void LDLTBKSB ( double[][]a, double []b) { 
    int i; int k; int n=a.length; for (i = 0; i < n; i++){ 
    for (k = 0; k < i; k++) b[i] = b[i] - a[i][k] * b[k]; } for (i = n - 1; i >= 0; i--){ 
    b[i] = b[i] / a[i][i]; for (k = i + 1; k < n; k++) b[i] = b[i] - a[k][i] * b[k]; } } public static void show(double[][] array) { 
    for(int i=0;i<array.length;i++) { 
    double[] itme=array[i]; for(double out:itme) { 
    System.out.print(out+"\t"); } System.out.println(); }System.out.println(); }; public static void show(double[] array) { 
    for(double out:array) { 
    System.out.print(out+"\t"); } System.out.println(); System.out.println(); } } 

2.0047 -2.3396 1.00235 -0.66693

R语言多项式回归

x=c(1,2,3,4,5) y = c(1,1.5,3,4.5,5) xy=data.frame(x=x,y=y) #model <- lm(xy$y ~ poly(x,3)) model <- lm(xy$y ~ x + I(x^2) + I(x^3)) 

回归模型

> model Call: lm(formula = xy$y ~ x + I(x^2) + I(x^3)) Coefficients: (Intercept) x I(x^2) I(x^3) 2.5000 -2.8333 1.5000 -0.1667 

模型摘要

> summary(model) Call: lm(formula = xy$y ~ x + I(x^2) + I(x^3)) Residuals: 1 2 3 4 5 3.052e-16 -1.221e-15 1.831e-15 -1.221e-15 3.052e-16 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 2.500e+00 1.256e-14 1.990e+14 3.20e-15 * x -2.833e+00 1.642e-14 -1.726e+14 3.69e-15 * I(x^2) 1.500e+00 6.094e-15 2.461e+14 2.59e-15 * I(x^3) -1.667e-01 6.729e-16 -2.477e+14 2.57e-15 * --- Signif. codes: 0 ‘*’ 0.001 ‘’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 2.554e-15 on 1 degrees of freedom Multiple R-squared: 1, Adjusted R-squared: 1 F-statistic: 6.39e+29 on 3 and 1 DF, p-value: 9.196e-16 

p值9.196e-16接近于0说明完美拟合。

拟合图像

x=c(1,2,3,4,5) y = c(1,1.5,3,4.5,5) f1=function(x){ -0.3+1.1*x } f3=function(x){ 2.5-2.83*x+1.5*x^2-0.167*x^3 } plot(x,y) curve(f1,from=0,to=6,col="blue",add=T) curve(f3,from=0,to=6,col="red",add=T) text(4,3.5, "y = -0.3+1.1*x",col="blue") text(3,1.5, "y = 2.5-2.83x+1.5x^2-0.167X^3",col="red") 

在这里插入图片描述

过拟合问题

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212784.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午7:16
下一篇 2026年3月18日 下午7:16


相关推荐

  • 随机数生成算法

    随机数生成算法转自:https://www.cnblogs.com/ECJTUACM-873284962/p/6926203.html1、蒙特卡洛法  蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似…

    2022年7月26日
    8
  • Git报错解决:OpenSSL SSL_read: Connection was reset, errno 10054 错误解决

    Git报错解决:OpenSSL SSL_read: Connection was reset, errno 10054 错误解决修改设置 解除 ssl 验证 gitconfigglo sslVerify false 此时 再执行 git 操作即可

    2026年3月20日
    2
  • influx配置文件详解

    influx配置文件详解influx 配置文件详解官方文档 https docs influxdata com influxdb v1 7 administrati config 全局配置 reporting disabled false 该选项用于上报 influxdb 的使用信息给 InfluxData 公司 默认值为 false 将此选项设置为 true 将禁用报告 bind address 8088 备份恢复时使用 默认值为 8088 Metastore 配置 meta 本部分控制 InfluxDBmeta

    2025年10月7日
    7
  • Java集合类的使用

    Java集合类的使用Java集合类Collection,它是一个接口,他有两个子接口List和Map,Collection主要方法booleanadd(Ee);booleanaddAll(Collection<?extendsE>c);booleanremove(Objecto);booleanremoveAll(Collection<?>c);voidclear();intsize();booleanisEmpty();booleancon

    2022年5月23日
    34
  • javaMD5加密工具类

    javaMD5加密工具类importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;/***CreatedbyZhou.xyon2016/12/27.*/publicclassEncryMD5{/***String->MD5*/publi

    2022年7月15日
    19
  • Logout_logoutAll

    Logout_logoutAll现在到注销。早些时候我们离开这个函数一片空白,现在是时候来填补它。在UsersController:注销()添加以下:$this->Session->setFlash(‘Good-Bye’);$this->redirect($this->Auth->logout());这个设置一个会话flash信息和日志使用身份验证用户的注销方法。身份验证的注销方法基本上删除身份验证会话密钥并返回一个可

    2025年8月25日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号