目录(?)
概念
最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y= φ(x)。
原理
[原理部分由个人根据互联网上的资料进行总结,希望对大家能有用]给定数据点pi(xi,yi),其中i=1,2,…,m。求近似曲线y= φ(x)。并且使得近似曲线与y=f(x)的偏差最小。近似曲线在点pi处的偏差δi= φ(xi)-y,i=1,2,...,m。
常见的曲线拟合方法:
1.使偏差绝对值之和最小
2.使偏差绝对值最大的最小
3.使偏差平方和最小
按偏差平方和最小的原则选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为最小二乘法。
推导过程:
1. 设拟合多项式为:
2. 各点到这条曲线的距离之和,即偏差平方和如下:
3. 为了求得符合条件的a值,对等式右边求ai偏导数,因而我们得到了:
.......
4. 将等式左边进行一下化简,然后应该可以得到下面的等式:
.......
5. 把这些等式表示成矩阵的形式,就可以得到下面的矩阵:
6. 将这个范德蒙得矩阵化简后可得到:
7. 也就是说X*A=Y,那么EA = X'*Y,便得到了系数矩阵A,同时,我们也就得到了拟合曲线。
实现
运行前提:
- Python运行环境与编辑环境;
- Matplotlib.pyplot图形库,可用于快速绘制2D图表,与matlab中的plot命令类似,而且用法也基本相同。
本博客中所有的博文都为笔者(Jairus Chan)原创。
如需转载,请标明出处:http://blog.csdn.net/JairusChan。
如果您对本文有任何的意见与建议,请联系笔者(JairusChan)。也可使用Apache开源库commons math,提供的功能更强大,
http://commons.apache.org/proper/commons-math/userguide/fitting.html
package com.fjsh.algorithm.leastSquareMethod.deal;
import org.apache.commons.math3.fitting.PolynomialCurveFitter;
import org.apache.commons.math3.fitting.WeightedObservedPoints;
public class LeastSquareMethodFromApache {
private static void testLeastSquareMethodFromApache() {
final WeightedObservedPoints obs = new WeightedObservedPoints();
obs.add(-3, 4);
obs.add(-2, 2);
// obs.add(-1, 3);
// obs.add(0, 0);
// obs.add(1, -1);
// obs.add(2, -2);
// obs.add(3, -5);
// Instantiate a third-degree polynomial fitter.
final PolynomialCurveFitter fitter = PolynomialCurveFitter.create(1);
// Retrieve fitted parameters (coefficients of the polynomial function).
final double[] coeff = fitter.fit(obs.toList());
for (double c : coeff) {
System.out.println(c);
}
}
/**
* 例如当参数是PolynomialCurveFitter.create(1);
* 点(-3, 4) (-2, 2) 此时拟合函数参数为-2,-2,公式为y=-2-2x;验证符合
* @param args
*/
public static void main(String[] args) {
testLeastSquareMethodFromApache();
}
}