因为我所在的项目要用到最小二乘法拟合,所有我抽时间将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. c#与oracle数据库连接池

    c#与oracle数据库连接池 在做一个项目,中间要使用webservice和oracle数据库.我在服务端做了用户身份认证,也就是使用session传递用户的登陆信息.在测试时,当用户少的时候,没有 ...

  2. 怎样使用jlink一键烧录整个flash Hi3518 a c e Hi3515 Hi3512

    以jlink烧录3515为例: 1\在jlink安装文件夹"C:\Program Files\SEGGER\JLinkARM_V426b"建立批处理文件"HI3515烧写 ...

  3. hdu1025 Constructing Roads In JGShining&#39;s Kingdom (nlogn的LIS)

    题目链接 第一次写nlogn复杂度的LIS,纪念一下. 题目意思是说.有两条平行线.两条平行线都有n个城市,都是从左到右标记为1--n,一条线上是富有城市,一个是贫穷城市.输入n.接下来有n行,p,r ...

  4. openstack之nova-api服务流程分析

    nova-api公布api服务没实用到一个些框架,基本都是从头写的.在不了解它时,以为它很复杂,难以掌握.花了两三天的时间把它分析一遍后,发现它本身的结构比較简单,主要难点在于对它所使用的一些类库不了 ...

  5. VS2010 TFS

    在本文的两个部分中,我将介绍Team Foundation Server的一些核心特征,重点介绍在本产品的日常应用中是怎样将这些特性结合在一起使用的. 作为一名软件开发者,在我的职业生涯中,我常常会用 ...

  6. Why 使用TLS记录封装IP层VPN IS A Bad Idea

    一个很自然的想法,使用TLS套餐一IP数据报实现第三层VPN.这种想法必须经过深思熟虑的,但不幸的是,.这是一个错误的想法.有文章<Why TCP Over TCP Is A Bad Idea& ...

  7. 无状态会话bean(3)---远程业务接口(没有排版)

    迄今为止,我们仅仅讨论了使用一个本地业务接口的会话bean.在这样的情况下.本地意味着仅仅能由执行在同一个应用程序server实例的JavaEE组件声明会话bean的依赖性.比如.远程client不可 ...

  8. Android开发中验证码的生成

    近期在做电商金融类的项目,验证码的生成方法不可缺少.先学习了一种.经过測试好用.从别处学习的代码,稍修改了一下可选择是否支持识别大写和小写.直接上代码. import android.app.Acti ...

  9. Qt数据类型转换

    把QString转换为double类型 方法1.QString str="123.45"; double val=str.toDouble(); //val=123.45 方法2. ...

  10. Oracle安装过程物理内存检查及临时temp空间不足解决办法

    物理内存 – 此先决条件将测试系统物理内存总量是否至少为 922MB (944128.0KB). 预期值 : N/A 实际值 : N/A 错误列表: – 可用物理内存 PRVF-7531 : 无法在节 ...