最小二乘法拟合java实现源程序(转)
因为我所在的项目要用到最小二乘法拟合,所有我抽时间将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实现源程序(转)的更多相关文章
- 利用最小二乘法拟合任意次函数曲线(C#)
原文:利用最小二乘法拟合任意次函数曲线(C#) ///<summary> ///用最小二乘法拟合二元多次曲线 ///</summary> ///< ...
- (转)最小二乘法拟合圆公式推导及vc实现[r]
(下文内容为转载,不过已经不清楚原创的是哪里了,特此说明) 转自: http://www.cnblogs.com/dotLive/archive/2006/10/09/524633.html 该网址下 ...
- 最小二乘法拟合非线性函数及其Matlab/Excel 实现(转)
1.最小二乘原理 Matlab直接实现最小二乘法的示例: close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; yrand = y + 0.5*r ...
- 最小二乘法的Java实现
最小二乘法原理十分简单,这里不再赘述.对于预测公式y' = a * x + b,最优解如下 double a = Sxy / Sxx; double b = yAvg - a * xAvg; doub ...
- 最小二乘法拟合非线性函数及其Matlab/Excel 实现
1.最小二乘原理 Matlab直接实现最小二乘法的示例: close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; yrand = y + 0.5*r ...
- 设置查看java的源程序
1.点 “window”-> "Preferences" -> "Java" -> "Installed JRES" 2. ...
- golang 实现最小二乘法拟合直线
func LeastSquares(x[]float64,y[]float64)(a float64,b float64){ // x是横坐标数据,y是纵坐标数据 // a是斜率,b是截距 xi := ...
- C#使用最小二乘法对多个离散点进行圆拟合
/// <summary> /// 最小二乘法拟合圆,计算拟合圆半径和拟合圆圆心 /// </summary> /// <param name="points& ...
- java.util.concurrent包详细分析--转
原文地址:http://blog.csdn.net/windsunmoon/article/details/36903901 概述 Java.util.concurrent 包含许多线程安全.测试良好 ...
随机推荐
- 日期格式化标签<fmt:formatDate>&<fmt:setTimeZone>时区标签的使用demo
日期格式化标签<fmt:formatDate>&<fmt:setTimeZone>时区标签的使用demo <%@ page contentType="t ...
- hdu 4739【位运算】.cpp
题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...
- SE 2014年4月5日
背景需求: 缺省情况下,Level-1路由器只将去往其它区域的报文发送到最近的Level-1-2路由器. 路由渗透使Level-1-2路由器将Level-2区域的路由信息发布到Level-1区域. 4 ...
- 开源一个适用iOS的数据库表结构更新机制的代码
将前段时间开源的代码.公布一下: ARDBConfig On the iOS, provide a database table structure update mechanism, ensure ...
- Java中读取某个目录下的所有文件和文件夹
import java.io.File; public class Test1 { public static void main(String[] args) { String path=" ...
- Apache James使用的方法及相关心得(转)
经过一番的辛苦努力,终于把James 配置搞定啦,好记性不如烂笔头啊,赶紧记下我的成功经过,以备以后查阅! 首先要做的就是配置域名的MX 记录啦: 先添加一条A记录: mail.abc.com 指向 ...
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
- POJ 2299 Ultra-QuickSort (求序列的逆序对数)
题意:废话了一大堆就是要你去求一个序列冒泡排序所需的交换的次数. 思路:实际上是要你去求一个序列的逆序队数 看案例: 9 1 0 5 4 9后面比它小的的数有4个 1后面有1个 0后面没有 5后面1个 ...
- 集合中Set_List必须覆盖 hashCode()与 equals()
集合中Set_List必须覆盖 hashCode()与 equals() @Override public int hashCode() { System.out.println("==== ...
- python学习笔记之十:文件和素材
这里将介绍函数和对象--文件和流,让你在程序调用期间存储数据,并且可以处理来自其他程序的数据. 一. 打开文件 1.1 open函数 open函数用来打开文件,语法如下:open(name,[.mod ...