最小二乘法原理

最小二乘法的目标:求误差的最小平方和,对应有两种:线性和非线性。线性最小二乘的解是closed-form(如下文),而非线性最小二乘没有closed-form,通常用迭代法求解(如高斯牛顿迭代法,本文不作介绍)。

【首先得到线性方程组】

1.概念

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。

利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。

最小二乘法还可用于曲线拟合。

2.原理

函数原型:

已知:

(x0,y0),(x1,y1)…(xi,yi)…(xn,yn)个点,n>=k。

偏差平方和:

偏差平方和最小值可以通过使偏导数等于零得到:

简化左边等式有:

写成矩阵形式:公式①

将这个范德蒙得矩阵化简后可得到:公式②

也就是说X*A=Y,那么A = (X’*X)-1*X’*Y,便得到了系数矩阵A,同时,我们也就得到了拟合曲线。

高斯消元法

【然后解线性方程组,即公式①】

1.概念

数学上,高斯消元法(或译:高斯消去法)(英语:Gaussian Elimination),是线性代数中的一个算法,可用来为线性方程组求解,求出矩阵的秩,以及求出可逆方阵的逆矩阵。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。

2.原理

3.伪代码

这个算法和上面谈到的有点不同,它由绝对值最大的部分开始做起,这样可以改善算法的稳定性。本算法由左至右地计算,每作出以下三个步骤,才跳到下一列和下一行:

  • 定出i列的绝对值最大的一个非0的数,将第i行的值与该行交换,使得该行拥有该列的最大值;
  • 将i列的数字除以该数,使得i列i行的数成为1;
  • 第(i+1)行以下(包括第(j+1)行)所有元素都转化为0。

所有步骤完成后,这个矩阵会变成一个行梯矩阵,再用代入法就可以求解该方程组。

 i = 1j = 1while (i ≤ m and j ≤ n) doFind pivot in column j, starting in row i    // 从第i行开始,找出第j列中的最大值(i、j值应保持不变)  maxi = ifor k = i+1 to m doif abs(A[k,j]) > abs(A[maxi,j]) thenmaxi = k   // 使用交换法找出最大值(绝对值最大)end ifend forif A[maxi,j] ≠ 0 then  // 判定找到的绝对值最大值是否为零:若不为零就进行以下操作;若为零则说明该列第(i+1)行以下(包括第(i+1)行)均为零,不需要再处理,直接跳转至第(j+1)列第(i+1)行swap rows i and maxi, but do not change the value of i   // 将第i行与找到的最大值所在行做交换,保持i值不变(i值记录了本次操作的起始行)Now A[i,j] will contain the old value of A[maxi,j].divide each entry in row i by A[i,j]    // 将交换后的第i行归一化(第i行所有元素分别除以A[i,j])Now A[i,j] will have the value 1.for u = i+1 to m do    // 第j列中,第(i+1)行以下(包括第(i+1)行)所有元素都减去A[i,j],直到第j列的i+1行以後元素均為零subtract A[u,j] * row i from row uNow A[u,j] will be 0, since A[u,j] - A[i,j] * A[u,j] = A[u,j] - 1 * A[u,j] = 0.end fori = i + 1   end ifj = j + 1  // 第j列中,第(i+1)行以下(包括第(i+1)行)所有元素均为零。移至第(j+1)列,从第(i+1)行开始重复上述步骤。end while

代码

public class CurveFitting {///<summary>///最小二乘法拟合二元多次曲线///例如y=ax+b///其中MultiLine将返回a,b两个参数。///a对应MultiLine[1]///b对应MultiLine[0]///</summary>///<param name="arrX">已知点的x坐标集合</param>///<param name="arrY">已知点的y坐标集合</param>///<param name="length">已知点的个数</param>///<param name="dimension">方程的最高次数</param>public static double[] MultiLine(double[] arrX, double[] arrY, int length, int dimension) {int n = dimension + 1;                 //dimension次方程需要求 dimension+1个 系数              double[][] Guass = new double[n][n + 1];      for (int i = 0; i < n; i++){ //求矩阵公式①int j;for (j = 0; j < n; j++){Guass[i][j] = SumArr(arrX, j + i, length);//公式①等号左边第一个矩阵,即Ax=b中的A}Guass[i][j] = SumArr(arrX, i, arrY, 1, length);//公式①等号右边的矩阵,即Ax=b中的b}        return ComputGauss(Guass, n);//高斯消元法}//求数组的元素的n次方的和,即矩阵A中的元素private static double SumArr(double[] arr, int n, int length) {double s = 0;for (int i = 0; i < length; i++){if (arr[i] != 0 || n != 0){s = s + Math.pow(arr[i], n);}else{s = s + 1;}}return s;}//求数组的元素的n次方的和,即矩阵b中的元素private static double SumArr(double[] arr1, int n1, double[] arr2, int n2, int length) {double s = 0;for (int i = 0; i < length; i++){if ((arr1[i] != 0 || n1 != 0) && (arr2[i] != 0 || n2 != 0))s = s + Math.pow(arr1[i], n1) * Math.pow(arr2[i], n2);elses = s + 1;}return s;        }//高斯消元法解线性方程组private static double[] ComputGauss(double[][] Guass, int n) {int i, j;int k, m;double temp;double max;double s;double[] x = new double[n];for (i = 0; i < n; i++) {x[i] = 0.0;//初始化}for (j = 0; j < n; j++) {max = 0;k = j;// 从第i行开始,找出第j列中的最大值(i、j值应保持不变)  for (i = j; i < n; i++) {if (Math.abs(Guass[i][j]) > max){max = Guass[i][j];// 使用交换法找出最大值(绝对值最大)k = i;}}if (k != j) {//将第j行与找到的最大值所在行做交换,保持i值不变(j值记录了本次操作的起始行)for (m = j; m < n + 1; m++) {temp = Guass[j][m];Guass[j][m] = Guass[k][m];Guass[k][m] = temp;}}if (max == 0) {// "此线性方程为奇异线性方程" return x;}// 第m列中,第(j+1)行以下(包括第(j+1)行)所有元素都减去Guass[j][m] * s / (Guass[j][j])//直到第m列的i+1行以後元素均为零for (i = j + 1; i < n; i++) {s = Guass[i][j];                for (m = j; m < n + 1; m++) {Guass[i][m] = Guass[i][m] - Guass[j][m] * s / (Guass[j][j]);                 }}}//结束for (j=0;j<n;j++)//回代过程(见公式4.1.5)for (i = n - 1; i >= 0; i--) {s = 0;for (j = i + 1; j < n; j++) {s = s + Guass[i][j] * x[j];}x[i] = (Guass[i][n] - s) / Guass[i][i];}return x;}//返回值是函数的系数public static void main(String[] args)  {double[] x = {0, 1, 2, 3, 4, 5, 6, 7};double[] y = {0, 1, 4, 9, 16, 25, 36, 49};double[] a = MultiLine(x, y, 8, 2);for(int i =0; i <a.length;i++){System.out.println(a[i]);}}
}

输出:

0.708333333333342
-0.37500000000000583
1.0416666666666674

取整就得到y=x^2。

算法#03--详解最小二乘法原理和代码相关推荐

  1. 常见算法详解(原理及代码实现Python版本)

    文章目录 前言 1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.快速排序 6.归并排序 7.二分法查找 总结 前言 最近复习了下常见的算法,在这里手动再写一遍,权当加深自己的印象.代码实现 ...

  2. STM32 外部中断详解(原理+配置代码)

    本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 文章目录 1 前言 2 STM32的外部中断 3 中断服务函数的映射关系 4 外部中断的配置 5 寄存器的 ...

  3. python 雪花id_基于python实现雪花算法过程详解

    这篇文章主要介绍了基于python实现雪花算法过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Snowflake是Twitter提出来的一个 ...

  4. 快速排序算法详解(原理,时间复杂度,实现代码)

    快速排序算法详解(原理.实现和时间复杂度) 快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出. 快 ...

  5. 蓝牙:CRC原理详解(附crc16校验代码)

    CRC原理详解(附crc16校验代码) 参考链接: https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html Cyclic Redun ...

  6. 粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解

    1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...

  7. 算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen

    算法:详解布隆过滤器的原理.使用场景和注意事项@知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data struc ...

  8. Dijkstra算法图文详解和C++代码

    文章目录 1 Dijkstra算法基本原理 2 算法过程图解1(有向图) 3 算法过程图解2(无向图) 4 C++代码 4.1 案例1代码 4.2 案例2邻接矩阵定义 4.3 案例2代码Dijkstr ...

  9. 最小生成树-Prim算法详解(含全部代码)

    目录 适用条件 测试所用图 算法详解 Prim算法代码 全部代码 实验结果 适用条件 加权连通图 测试所用图 所用原图及生成过程 其中,(a) 为原图,圆圈里面是节点的名称,边上的数字是边的权值.由实 ...

最新文章

  1. 这么简单的目标检测赛题,竟然设置260万现金奖!
  2. SQL语句将某字段查询出以逗号隔开
  3. 1、C++招聘笔试--C++中的C
  4. HBase—基础介绍
  5. 【bzoj1705】[Usaco2007 Nov]Telephone Wire 架设电话线 dp
  6. jqGrid 使用案例及笔记
  7. 微课|中学生可以这样学Python(例9.1):Excel导入SQLite(1)
  8. python pandas excel 排序_Pandas 按组汇总和列排序 - python
  9. Ubuntu 16.04 apt 国内源
  10. ue4设置组合键_UE4快捷键
  11. 【Latex学习】Latex中插入超链接/网址
  12. Win10 wifi、蓝牙打不开
  13. msg1500说明书_MSG1500刷机笔记
  14. 念念不忘,必有回响:Powered By Typecho
  15. 3dsmax2020安装报1603错误的解决方法
  16. 李章最帅!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  17. 面试.net资深程序员的前5分钟
  18. 正确认识形势 提升信心 增强斗志
  19. kernel网络之软中断
  20. 分析-Bitlocker固定磁盘随系统自动解锁

热门文章

  1. 《Android Studio应用开发实战详解》——导读
  2. AndroidUtils:Android开发不得不收藏的Utils
  3. windows系统“彻底”隐藏任务栏
  4. 学习新概念第一册 第一堂课 音标和基础知识储备(1)
  5. python全球购代码_京东全球购?
  6. 【谦川解读】银保监会2号文
  7. Htc G10 2.3降级刷机方法
  8. 自定义相机Camera,相机/视频实时滤镜 - android
  9. 第六届全国信息技术应用水平大赛Java组复赛B卷试题答案
  10. Java 进阶 -- 集合(一)