因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用。
/**
 * <p>函数功能:最小二乘法曲线拟合</p>
 * @param x 实型一维数组,长度为 n 。存放给定 n 个数据点的 X 坐标
 * @param y 实型一维数组,长度为 n 。存放给定 n 个数据点的 Y 坐标
 * @param n 变量。给定数据点的个数
 * @param a 实型一维数组,长度为 m 。返回 m-1 次拟合多项式的 m 个系数
 * @param m 拟合多项式的项数,即拟合多项式的最高次数为 m-1.
 *          要求 m<=n 且m<=20。若 m>n 或 m>20 ,则本函数自动按 m=min{n,20} 处理.
 * <p>Date:2007-12-25 16:21 PM</p>
 * @author qingbao-gao
 * @return 
 */
 public static double[] PolyFit(double x[], double y[], int n, double a[], int m)
 {
  int i, j, k;
  double z, p, c, g, q = 0, d1, d2; 
  double []s=new double[20];
  double []t=new double[20];
  double[] b=new double[20];
  double[]dt=new double[3];
  for (i = 0; i <= m-1; i++)
  {
   a[i] = 0.0;
  }
  if (m > n)
  {
   m = n;
  }
  if (m > 20)
  {
   m = 20;
  }
  z = 0.0;
  for (i = 0; i <= n-1; i++)
  {
   z = z+x[i]/(1.0 *n);
  }
  b[0] = 1.0;
  d1 = 1.0 * n;
  p = 0.0;
  c = 0.0;
  for (i = 0; i <= n-1; i++)
  {
   p = p+(x[i]-z);
   c = c+y[i];
  }
  c = c/d1;
  p = p/d1;
  a[0] = c * b[0];
  if (m > 1)
  {
   t[1] = 1.0;
   t[0] = -p;
   d2 = 0.0;
   c = 0.0;
   g = 0.0;
   for (i = 0; i <= n-1; i++)
   {
    q = x[i]-z-p;
    d2 = d2+q * q;
    c = c+y[i] *q;
    g = g+(x[i]-z) *q * q;
   }
   c = c/d2;
   p = g/d2;
   q = d2/d1;
   d1 = d2;
   a[1] = c * t[1];
   a[0] = c * t[0]+a[0];
  }
  for (j = 2; j <= m-1; j++)
  {
   s[j] = t[j-1];
   s[j-1] = -p * t[j-1]+t[j-2];
   if (j >= 3)
    for (k = j-2; k >= 1; k--)
       {
     s[k] = -p * t[k]+t[k-1]-q * b[k];
       }
   s[0] = -p * t[0]-q * b[0];
   d2 = 0.0;
   c = 0.0;
   g = 0.0;
   for (i = 0; i <= n-1; i++)
   {
    q = s[j];
    for (k = j-1; k >= 0; k--)
    {
     q = q *(x[i]-z)+s[k];
    }
    d2 = d2+q * q;
    c = c+y[i] *q;
    g = g+(x[i]-z) *q * q;
   }
   c = c/d2;
   p = g/d2;
   q = d2/d1;
   d1 = d2;
   a[j] = c * s[j];
   t[j] = s[j];
   for (k = j-1; k >= 0; k--)
   {
    a[k] = c * s[k]+a[k];
    b[k] = t[k];
    t[k] = s[k];
   }
  }
  dt[0] = 0.0;
  dt[1] = 0.0;
  dt[2] = 0.0;
  for (i = 0; i <= n-1; i++)
  {
   q = a[m-1];
   for (k = m-2; k >= 0; k--)
   {
    q = a[k]+q *(x[i]-z);
   }
   p = q-y[i];
   if (Math.abs(p) > dt[2])
   {
    dt[2] = Math.abs(p);
   }
   dt[0] = dt[0]+p * p;
   dt[1] = dt[1]+Math.abs(p);
  }
  return a;
 }
/**
  * <p>对X轴数据节点球平均值</p>
  * @param x 存储X轴节点的数组
  * <p>Date:2007-12-25 20:21 PM</p>
  * @author qingbao-gao
  * @return  平均值
  */
 public static double ave(double []x)
 {
  double ave=0;
  double sum=0;
  if(x!=null)
  {
   for(int i=0;i<x.length;i++)
   {
    sum+=x[i];
   }
   System.out.println("sum-->"+sum);
   ave=sum/x.length;
   System.out.println("ave"+ave+"x.length"+x.length);
  }
  return ave;
 }
 /**
  * <p>由X值获得Y值</p>
  * @param x  当前X轴输入值,即为预测的月份
  * @param xx 当前X轴输入值的前X数据点
  * @param a  存储多项式系数的数组
  * @param m  存储多项式的最高次数的数组
  * <p>Date:2007-12-25 PM 20:07</p>
  * <P>Author:qingbao-gao</P>
  * @return   对应X轴节点值的Y轴值
  */
 public static double getY(double x,double[]xx,double[]a,int m)
 {
  double y=0;
  double ave=ave(xx);
  
  double l=0;
  for(int i=0;i<m;i++)
  {
   l=a[0];
   if(i>0)
   {
    y+=a[i]*Math.pow((x-ave),i );
    System.out.println(i+"--|-->"+y+"--a[i]--"+a[i]);
   }
   System.out.println("a[0]|"+a[0]);
  }
  System.out.println("l--|"+(l));
  return (y+l);
 }
//--------------------------------------------测试代码

public static void main(String []args)throws DBException
 {

double []x={200401,200402,200403,200404,200405,200406,200407,200408,200409,2004010,2004011,2004012,200501,200502,200503,200504};
  double []y={51,51,53,53,54,55,57,60,63,64,66,66,69,71,72,75};
  double[]a=new double[20];
  double[]aa= PolyFit(x,  y,  16,a, 3);
  double yy=0;
  System.out.println("拟合-->"+getY(200505,x,aa,3));

}

测试结果为:拟合-->72.38898870320554
效果还可以。

http://www.blogjava.net/1504/archive/2009/04/15/265869.html

最小二乘法拟合java实现源程序(转)的更多相关文章

  1. 利用最小二乘法拟合任意次函数曲线(C#)

    原文:利用最小二乘法拟合任意次函数曲线(C#) ///<summary>     ///用最小二乘法拟合二元多次曲线     ///</summary>     ///< ...

  2. (转)最小二乘法拟合圆公式推导及vc实现[r]

    (下文内容为转载,不过已经不清楚原创的是哪里了,特此说明) 转自: http://www.cnblogs.com/dotLive/archive/2006/10/09/524633.html 该网址下 ...

  3. 最小二乘法拟合非线性函数及其Matlab/Excel 实现(转)

    1.最小二乘原理 Matlab直接实现最小二乘法的示例: close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; yrand = y + 0.5*r ...

  4. 最小二乘法的Java实现

    最小二乘法原理十分简单,这里不再赘述.对于预测公式y' = a * x + b,最优解如下 double a = Sxy / Sxx; double b = yAvg - a * xAvg; doub ...

  5. 最小二乘法拟合非线性函数及其Matlab/Excel 实现

    1.最小二乘原理 Matlab直接实现最小二乘法的示例: close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; yrand = y + 0.5*r ...

  6. 设置查看java的源程序

    1.点 “window”-> "Preferences" -> "Java" -> "Installed JRES" 2. ...

  7. golang 实现最小二乘法拟合直线

    func LeastSquares(x[]float64,y[]float64)(a float64,b float64){ // x是横坐标数据,y是纵坐标数据 // a是斜率,b是截距 xi := ...

  8. C#使用最小二乘法对多个离散点进行圆拟合

    /// <summary> /// 最小二乘法拟合圆,计算拟合圆半径和拟合圆圆心 /// </summary> /// <param name="points& ...

  9. java.util.concurrent包详细分析--转

    原文地址:http://blog.csdn.net/windsunmoon/article/details/36903901 概述 Java.util.concurrent 包含许多线程安全.测试良好 ...

随机推荐

  1. bzoj(矩阵快速幂)

    题意:定义Concatenate(1,N)=1234567……n.比如Concatenate(1,13)=12345678910111213.给定n和m,求Concatenate(1,n)%m. (1 ...

  2. hdu1330(递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1330 分析:经典问题,n 块相同的木板重叠,最多能够伸出桌面多远 对于n张卡片的最佳摆法,我们只需要在 ...

  3. 读取数据表中第m条到第n条的数据,SQL语句怎么写?

    原文:读取数据表中第m条到第n条的数据,SQL语句怎么写? 对于MySQL或者Oracle来说,如果实现从Table 表中取出第 m 条到第 n 条的记录操作,我们需要TOP函数(不是所有的数据库都支 ...

  4. maven仓库总结,maven私服搭建

    配置pom.xml依赖包时在这里找包的描述: http://search.maven.org/#browse 以java为根目录. mvn archtype:generate -DgroupId=zt ...

  5. 分布式消息系统Jafka入门指南之二

    分布式消息系统Jafka入门指南之二 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 三.Jafka的文件夹结构 1.安装tree命令 $ sudo yu ...

  6. JAVA中各种去除空格

    1. String.trim() trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间 String str ...

  7. 使IIS Express支持其他网络客户端访问

    今天尝试利用Android客户端Web浏览器访问VS2012 IIS Express调试中的Web应用,发现这个IIS Express仅支持localhost主机名地址访问. 上网搜索找到解决方案,几 ...

  8. Oracle SQL Lesson (4) - 使用转换函数和条件表达式

    隐式转换select * from emp where empno='7788'字符(char,varchar2)转换为数字(number)或日期(date)数字或日期转换为字符 显式转换字符转换为数 ...

  9. erlang shell表格数据对齐

    近期在erlang shell做一些測试,为了让測试结果数据显得更直观,想对齐须要打印的数据,做成像表格一样的效果. 開始的想法是在数据中插入tab. 当然,erlang也有对tab的支持,但实际效果 ...

  10. php我们需要把握面试题目金鸡基础

    1.session与cookie差分? 答:session:储存用户訪问的全局唯一变量,存储在server上的php指定的文件夹中的(session_dir)的位置进行的存放 cookie:用来存储连 ...