已知一组数据,用JAVA JFRAME利用最小二乘法求出该组数据的多项式拟合公式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已知一组数据,用JAVA JFRAME利用最小二乘法求出该组数据的多项式拟合公式相关的知识,希望对你有一定的参考价值。

附其中一组数据X=1,3,4,5,6,7,8,9,10;Y=10,5,4,2,1,1,2,3,4;阶数为2阶
另:最好阶数设为m
需要得出公式!急求!
尽快解决后再加30

/**
* 最小二乘法计算类
*
* @author Administrator
*
*/
public class LeastSquareMethod
private double[] x;
private double[] y;
private double[] weight;
private int m;

private double[] coefficient;

public LeastSquareMethod(double[] x, double[] y, int m)
if (x == null || y == null || x.length < 2 || x.length != y.length
|| m < 2)
throw new IllegalArgumentException("无效的参数");
this.x = x;
this.y = y;
this.m = m;
weight = new double[x.length];
for (int i = 0; i < x.length; i++)
weight[i] = 1;



public LeastSquareMethod(double[] x, double[] y, double[] weight, int m)
if (x == null || y == null || weight == null || x.length < 2
|| x.length != y.length || x.length != weight.length || m < 2)
throw new IllegalArgumentException("无效的参数");
this.x = x;
this.y = y;
this.m = m;
this.weight = weight;


public double[] getCoefficient()
if (coefficient == null)
compute();
return coefficient;


public double fit(double v)
if (coefficient == null)
compute();
if (coefficient == null)
return 0;
double sum = 0;
for (int i = 0; i < coefficient.length; i++)
sum += Math.pow(v, i) * coefficient[i];

return sum;


private void compute()
if (x == null || y == null || x.length <= 1 || x.length != y.length
|| x.length < m || m < 2)
return;

double[] s = new double[(m - 1) * 2 + 1];
for (int i = 0; i < s.length; i++)
for (int j = 0; j < x.length; j++)
s[i] += Math.pow(x[j], i) * weight[j];

double[] f = new double[m];
for (int i = 0; i < f.length; i++)
for (int j = 0; j < x.length; j++)
f[i] += Math.pow(x[j], i) * y[j] * weight[j];

double[][] a = new double[m][m];
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++)
a[i][j] = s[i + j];


coefficient = Algorithm.multiLinearEquationGroup(a, f);


/**
* @param args
*/
public static void main(String[] args)
LeastSquareMethod l = new LeastSquareMethod(
new double[] 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 ,
new double[] 37.84, 44.55, 45.74, 63.8, 76.67, 105.59, 178.48, 355.27, 409.92 ,
new double[] 11, 12, 13, 14, 15, 16, 17, 18, 19 ,
2);
double[] x = l.getCoefficient();
for (double xx : x)
System.out.println(xx);

System.out.println(l.fit(2009));


参考技术A http://baike.baidu.com/view/1884390.htm 在这里追问

我要的是用JAVA语言编程啊。。。

最大似然估计与最小二乘

最大似然估计,就是利用已知的样本结果反推最有可能(最大概率)导致这样结果的参数值。
例如:一个麻袋里有白球与黑球,但是我不知道它们之间的比例,那我就有放回的抽取10次,结果我发现我抽到了8次黑球2次白球,我要求最有可能的黑白球之间的比例时,就采取最大似然估计法。

MLE可以看作一种特殊情况下的Bayesian 估计,具体来说,就是在prior (先验)是 diffuse (无知的)情况下,让posterior(后验) 分布取得极大值的系数值。我们有一些理论模型,记作 "model",这个model 是什么,在很多实践中,就是一个模型中关键系数的值是什么这样的问题(不同的系数的值,我们称作不同的model) 。我们现在又观测到一组数据,记作"observation"。那么问题来了,给定一个model (一组关键系数的值),必然会有关于observation 的分布密度函数,所以我们知道P(observation|model) (给定一个model,observation的条件分布)的函数形式。

我们真正关心的,却是 P(model|observation) 的函数形式,也就是给定了当前的observation (observation是实际观测到的,是确定下来的),到底不同的model的概率是什么。当然,一个很贪心的做法,就是找到那个能把P(model|observation) 取到最大值的model (给定某个观测,最有可能的model)。

现在根据贝耶斯原理,

P(model|observation) = [ P(observation|model) * P(model) ]/ P(observation)

其中P(observation) 不太重要,因为我们想知道不同model 是如何影响 P(model|observation)的,或者是贪心的求P(model|observation)的最大值。而P(observation)已经固定下来了,不随model改变,所以我们无视他。

我们如果知道 P(model)(所谓的Prior) 的函数形式,那么就没有什么问题了。此时的P(model|observation)是一个关于model 的函数。报告这个P(model|observation)作为model的函数的函数形式,就叫贝耶斯估计。可是,这需要我们知道P(model)。实际中我们不知道这个玩意,所以一般我们猜一个。

我们如果承认不知道P(model),认为我们对他是无知的话,那么P(model) = 常数 for all model,此时求P(model|observation) 最大值,也就等价于求P(observation|model) 的最大值,这就叫做MLE。

 
最小二乘:找到一个(组)估计值,使得实际值与估计值的距离最小。本来用两者差的绝对值汇总并使之最小是最理想的,但绝对值在数学上求最小值比较麻烦,因而替代做法是,找一个(组)估计值,使得实际值与估计值之差的平方加总之后的值最小,称为最小二乘。“二乘”的英文为least square,其实英文的字面意思是“平方最小”。这时,将这个差的平方的和式对参数求导数,并取一阶导数为零,





以上是关于已知一组数据,用JAVA JFRAME利用最小二乘法求出该组数据的多项式拟合公式的主要内容,如果未能解决你的问题,请参考以下文章

matlab怎么将点云数据用最小二乘方法拟合出平面

最小二乘拟合(转)

halcon之最小二乘拟合直线

最大似然估计与最小二乘

常用算法知识:最小二乘的几何意义及投影矩阵

3D 最小二乘平面