数值计算——线性最小二乘问题

        最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
        m×n的线性方程组Ax=b是否有解?就是b能否表示成A的列向量的线性组合,当m=n时,肯定有解;当m>n,若b∈span(A)那么有解,否则无解。而对于线性最小二乘问题Ax=b的解唯一的充要条件就是A列满秩,即rank(A)=n。用最小二乘法求解该方程就是使得残差向量r=b-Ax的二范数的平方取最小。
       这里使用正规方程组、QR分解两种方法求解线性最小二乘问题。

1、正规方程组

      如果A列满秩,那么n×n正定对称正规方程组与m×n最小二乘问题Ax=b同解,求解该方程组则可通过楚列斯基分解法求得。理论上,有正规方程组可以得到线性最小二乘问题的精确解,但是由于正规方程组会出现条件数平方效应(叉积矩阵的条件数是原矩阵条件数的平方),所以往往得不到所期待的效果。
     代码实现也比较简单,只要求出A的转置、A的转置×A、A的转置×b就可以使用上一篇的楚列斯基分解求出方程的解了。
package com.kexin.lab4;public class NomalEquation {/*** Cholesky分解* * @param a* @return*/public static double[][] Cholesky(double[][] a) {int n = a.length;// 楚列斯基分解for (int k = 0; k < n; k++) {a[k][k] = Math.sqrt(a[k][k]);for (int i = k + 1; i < n; i++) {a[i][k] = a[i][k] / a[k][k];}for (int j = k + 1; j < n; j++) {for (int i = k + 1; i < n; i++) {a[i][j] = a[i][j] - a[i][k] * a[j][k];}}}return a;}/*** 转置二维矩阵* * @param a* @return*/public static double[][] Transposition(double[][] a) {int m = a.length;int n = a[0].length;double[][] result = new double[n][m];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {result[j][i] = a[i][j];}}return result;}/*** 矩陣相乘* * @param a* @param a1* @return*/public static double[][] MultiEquation(double[][] a, double[][] a1) {double[][] result = new double[a.length][a1[0].length];int x, i, j, tmp = 0;for (i = 0; i < a.length; i++) {for (j = 0; j < a1[0].length; j++) {for (x = 0; x < a1.length; x++) {tmp += a[i][x] * a1[x][j];// 矩阵AB中a_ij的值等于矩阵A的i行和矩阵B的j列的乘积之和}result[i][j] = tmp;tmp = 0; // 中间变量,每次使用后都得清零}}return result;}public static void main(String[] args) {// 输入方程系数矩阵A//double[][] a1 = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 }, { -1, 1, 0 }, { -1, 0, 1 }, { 0, -1, 1 } };
//      double[][] a1 = {{0.16,0.10},{0.17,0.11},{2.02,1.29}};double[][] a1 = {{2,4},{3,-5},{1,2},{2,1}};double[][] a2 = Transposition(a1); // A的转置矩阵// 输入方程矩阵b//double[] b1 = { 1237, 1941, 2417, 711, 1177, 475 };
//      double[] b1 = {0.27,0.25,3.33};double[] b1 ={11,3,6,7};double[][] a = MultiEquation(a2, a1); // 系数矩阵的转置和系数矩阵的乘积n*n// 求解变化后的结果矩阵a2*b1int n = a2.length;int m = b1.length;double[] b = new double[n];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {b[i] += a2[i][j] * b1[j];}}// 楚列斯基分解系数矩阵的转置和系数矩阵的乘积aPrint2DArray("a", a);PrintArray("b", b);a = Cholesky(a);m = b.length;n = a.length;double x[] = new double[m];// 前代计算for (int j = 0; j < m; j++) {if (a[j][j] != 0) {x[j] = b[j] / a[j][j];b[j] = x[j];}for (int i = j + 1; i < m; i++) {b[i] = b[i] - a[i][j] * x[j];}}// 将a进行转置a = Transposition(a);// 回代计算for (int j = m - 1; j >= 0; j--) {if (a[j][j] != 0) {x[j] = b[j] / a[j][j];}for (int i = 0; i <= j - 1; i++) {b[i] = b[i] - a[i][j] * x[j];}}// 输出结果PrintArray("x", x);}/*** 打印1D数组* @param str* @param result*/public static void PrintArray(String str, double[] result) {int n = result.length;System.out.print(str + "\n[");for (int i = 0; i < n; i++) {System.out.print(result[i] + "\t");}System.out.print(']');System.out.println();System.out.println();}/*** 打印2D数组* @param str* @param result*/public static void Print2DArray(String str, double[][] result) {int n = result.length;int m = result[0].length;System.out.print(str + "\n");for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++)System.out.print(result[i][j] + "\t");System.out.println();}System.out.println();}
}

2、QR分解

      QR分解法是目前求一般矩阵全部特征值的最有效并广泛应用的方法,一般矩阵先经过正交相似变化成为Hessenberg矩阵,然后再应用QR方法求特征值和特征向量。它是将矩阵分解成一个正规正交矩阵Q与上三角形矩阵R,所以称为QR分解法,与此正规正交矩阵的通用符号Q有关。
      计算矩阵QR分解的过程与用高斯消去法计算LU分解类似,都是在矩阵A中逐步引入零元素,使其具有上三角的形式。但这里用来约化的是正交阵(矩阵×矩阵的转置=单位阵),而不是初等消去阵,目的是保持2-范数不变。这类正交化的方法有很多,最常用的是豪斯霍尔德(Householder)变换。
package com.kexin.lab4;
/*** 使用豪斯霍尔德进行QR分解* @author KeXin**/
public class Householder {public static void main(String[] vd) {int i, j, k;// 初始化//double[][] a = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 }, { -1, 1, 0 }, { -1, 0, 1 }, { 0, -1, 1 } };//double[] b = { 1237, 1941, 2417, 711, 1177, 475 };
//      double[][] a = {{0.16,0.10},{0.17,0.11},{2.02,1.29}};
//      double[] b = {0.26,0.28,3.31};double[][] a = {{2,4},{3,-5},{1,2},{2,1}};double[] b ={11,3,6,7};int m = a.length;int n = a[0].length;double sum, β = 0, γ = 0, x[] = new double[n];double v[] = new double[m];// 做HouseHolder转换for (k = 0; k < n; k++) {sum = 0;// 初始化v[]for (i = 0; i < k ; i++) {v[i] = 0;}for (i = k; i < m; i++) {v[i] = a[i][k];}// 求αfor (j = k; j < m; j++) {sum = sum + a[j][k] * a[j][k];}// 处理符号if (a[k][k] >= 0) {sum = -Math.sqrt(sum);} else {sum = Math.sqrt(sum);}v[k] = v[k] - sum;β = 0;for (j = k; j < m; j++) {β = β + v[j] * v[j];}if (β == 0) {// donothing}for (j = k; j < n; j++) {γ = 0;for (i = k; i < m; i++) {γ = γ + v[i] * a[i][j];}for (i = k; i < m; i++) {a[i][j] = a[i][j] - (2 * γ / β) * v[i];if (Math.abs(a[i][j]) < 0.00001) {a[i][j] = 0;}}}double sumb = 0;for (i = k; i < m; i++) {sumb = sumb + b[i] * v[i];}for (i = 0; i < m; i++) {b[i] = b[i] - (2 * sumb / β) * v[i];}}Print2DArray("经HouseHolder变换后矩阵为:", a);PrintArray("矩阵b为:", b);// 回代计算for (i = n - 1; i >= 0; i--) {if (a[i][i] != 0) {x[i] = b[i] / a[i][i];}for (j = 0; j <=i-1; j++) {b[j] = b[j] - x[i] * a[j][i];}}PrintArray("矩阵x为:", x);double r = 0;for (i = m-1; i >= m/2; i--) {r = r + b[i] * b[i];}System.out.println("残差‖r‖为:" + r);}/*** 打印1D数组* * @param str* @param result*/public static void PrintArray(String str, double[] result) {int n = result.length;System.out.print(str + "\n[");for (int i = 0; i < n; i++) {System.out.print(Math.round(result[i]) + "\t");}System.out.print(']');System.out.println();System.out.println();}/*** 打印2D数组* * @param str* @param result*/public static void Print2DArray(String str, double[][] result) {int n = result.length;int m = result[0].length;System.out.print(str + "\n");for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++)System.out.print(result[i][j] + "\t");System.out.println();}System.out.println();}
}

数值计算——线性最小二乘问题相关推荐

  1. MULLS:一种基于多尺度线性最小二乘的激光SLAM算法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨paopaoslam 来源丨 泡泡机器人SLAM 标题:MULLS: Versatile LiD ...

  2. 线性最小二乘问题求解的豪斯荷尔德法C实现

    求解线性最小二乘问题的豪斯荷尔德法 需要调用的QR分解见另一篇: 一般实矩阵的QR分解 下面是具体算法: #include "4maqr.c"#include "stdl ...

  3. 求解线性最小二乘问题的奇异值分解及广义逆法的C++实现

    求解线性最小二乘问题的广义逆法的C++实现 1,功能 2,方法说明 3,函数语句与形参说明 第一步,求对系数矩阵进行奇异值分解(muav函数) #include "stdlib.h" ...

  4. 谈谈自己对线性最小二乘和非线性最小二乘之间关系的理解~

    最小二乘问题,是最基本.最实用.最应用广泛的的数学模型,在机器学习中更是得到了极大的应用(公式1),比如说我们的PCA,最经典的解释就是:最小化样本与其重构样本之间的误差和.采用的公式我不用写出来大家 ...

  5. GSL中的线性最小二乘拟合

    线性最小二乘拟合 本章描述使用线性组合函数对实验数据进行最小二乘拟合的例程.数据可以是加权的,也可以是未加权的,即带有已知的或未知的错误.对于加权数据,函数计算最佳拟合参数及其相关的协方差矩阵.对于未 ...

  6. Matlab最小二乘法:线性最小二乘、加权线性最小二乘、稳健最小二乘、非线性最小二乘与剔除异常值效果比较

    最近我们被客户要求撰写关于最小二乘法的研究报告,包括一些图形和统计输出.matlab软件在拟合数据时使用最小二乘法.拟合需要一个参数模型,该模型将因变量数据与具有一个或多个系数的预测数据相关联.拟合过 ...

  7. 一文详解线性最小二乘与非线性最小二乘

    一文详解线性最小二乘与非线性最小二乘 一.最小二乘法的引出 二.线性最小二乘法 1.线性最小二乘的描述 2.线性最小二乘特殊情况的求解 3.线性最小二乘一般情况的求解 三.非线性最小二乘法 1.非线性 ...

  8. h = a –bqc线性最小二乘问题 c语言,物理实验之最小二乘法 | 怎样学习大学物理小组 | 果壳网 科技有意思...

    物理实验中,数据处理经常用到最小二乘法.当然最小二乘法用手算的话好麻烦啊. 大家可能已经知道最小二乘法是什么了,这里也不多说了,就简单提一下. 一.最小二乘法原理 线性的最小二乘法是用来产生最能代表一 ...

  9. 数值计算之 最小二乘法(1)最小二乘计算与线性方程

    数值计算之 最小二乘法(1)最小二乘计算与矩阵 前言 最小二乘法与线性方程组 最小二乘解与矩阵计算 总结 前言 本篇开启一个非常重要的内容,最小二乘法.它在方程组求解.多视图几何计算.线性优化等方面具 ...

最新文章

  1. ASP.NET性能调整之解决Server Too Busy错误
  2. Spring Cloud Eureka 入门 (三)服务消费者详解
  3. 廖雪峰python学习笔记——函数式编程
  4. 在C#程序设计中使用Win32 API
  5. 动手写了一个12306插件 chrome浏览器
  6. ngx-material中Datepicker的日期格式化和选择语系
  7. 中国男性的私密数据大赏,女生勿入!
  8. 【图解深度学习】【章节:2-1.1 | 什么是机器学习?】连小学生都能看懂的深度学习基础总结
  9. java环境变量的设置方法_Java环境变量配置方法详解
  10. mysql嵌套查询实例_MySQL嵌套查询实例详解_MySQL
  11. Java Ajax技术详解:(一)Ajax 简介
  12. DDD聚合设计的几个原则的简单讨论
  13. 使用OOP思想二次封装echarts
  14. 编程:随机生成1-100之间的数字,如果猜对了结束游戏,如果猜错则继续猜并提示所猜测的数字是大于还是小于所指定的数,最终提示猜对所用的次数。
  15. 如何在地图上显示多个红包商店 vue
  16. 全球与中国汽车点火线圈市场深度研究分析报告
  17. 时间序列分析-预测Apple股票价格
  18. 正则表达式“\\s+“ 匹配任意空白字符
  19. javac 和java 的命令
  20. [antd-mobile]Button组件点击之后无法恢复原样

热门文章

  1. 《Python编程:从入门到实战》(第2版)学习笔记 第5章 if语句
  2. AI for Science年度激辩:AlphaFold成功难以复制,数据人才生态建设都是挑战|MEET2023...
  3. 关于linux的进程中的各个线程cpu占用情况的分析和查看
  4. 已知每个部门有一个经理,统计输出部门名称、部门总人数、 总工资和部门经理。
  5. 示例程序009--阙值化(二值化,cvThreshold)
  6. 【Leetcode刷题Python】40. 组合总和 II
  7. ArcGIS Pro数据加载学习总结
  8. 背篼酥课堂第八课--APP开发--app图形化编程
  9. 公主连结显示服务器内部错误,公主连结Re:Dive无法连接服务器是什么原因
  10. 特惠快车和快车的区别,滴滴特惠快车老司机说了实话?