数值计算——线性最小二乘问题
数值计算——线性最小二乘问题
1、正规方程组
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分解
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();}
}
数值计算——线性最小二乘问题相关推荐
- MULLS:一种基于多尺度线性最小二乘的激光SLAM算法
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨paopaoslam 来源丨 泡泡机器人SLAM 标题:MULLS: Versatile LiD ...
- 线性最小二乘问题求解的豪斯荷尔德法C实现
求解线性最小二乘问题的豪斯荷尔德法 需要调用的QR分解见另一篇: 一般实矩阵的QR分解 下面是具体算法: #include "4maqr.c"#include "stdl ...
- 求解线性最小二乘问题的奇异值分解及广义逆法的C++实现
求解线性最小二乘问题的广义逆法的C++实现 1,功能 2,方法说明 3,函数语句与形参说明 第一步,求对系数矩阵进行奇异值分解(muav函数) #include "stdlib.h" ...
- 谈谈自己对线性最小二乘和非线性最小二乘之间关系的理解~
最小二乘问题,是最基本.最实用.最应用广泛的的数学模型,在机器学习中更是得到了极大的应用(公式1),比如说我们的PCA,最经典的解释就是:最小化样本与其重构样本之间的误差和.采用的公式我不用写出来大家 ...
- GSL中的线性最小二乘拟合
线性最小二乘拟合 本章描述使用线性组合函数对实验数据进行最小二乘拟合的例程.数据可以是加权的,也可以是未加权的,即带有已知的或未知的错误.对于加权数据,函数计算最佳拟合参数及其相关的协方差矩阵.对于未 ...
- Matlab最小二乘法:线性最小二乘、加权线性最小二乘、稳健最小二乘、非线性最小二乘与剔除异常值效果比较
最近我们被客户要求撰写关于最小二乘法的研究报告,包括一些图形和统计输出.matlab软件在拟合数据时使用最小二乘法.拟合需要一个参数模型,该模型将因变量数据与具有一个或多个系数的预测数据相关联.拟合过 ...
- 一文详解线性最小二乘与非线性最小二乘
一文详解线性最小二乘与非线性最小二乘 一.最小二乘法的引出 二.线性最小二乘法 1.线性最小二乘的描述 2.线性最小二乘特殊情况的求解 3.线性最小二乘一般情况的求解 三.非线性最小二乘法 1.非线性 ...
- h = a –bqc线性最小二乘问题 c语言,物理实验之最小二乘法 | 怎样学习大学物理小组 | 果壳网 科技有意思...
物理实验中,数据处理经常用到最小二乘法.当然最小二乘法用手算的话好麻烦啊. 大家可能已经知道最小二乘法是什么了,这里也不多说了,就简单提一下. 一.最小二乘法原理 线性的最小二乘法是用来产生最能代表一 ...
- 数值计算之 最小二乘法(1)最小二乘计算与线性方程
数值计算之 最小二乘法(1)最小二乘计算与矩阵 前言 最小二乘法与线性方程组 最小二乘解与矩阵计算 总结 前言 本篇开启一个非常重要的内容,最小二乘法.它在方程组求解.多视图几何计算.线性优化等方面具 ...
最新文章
- ASP.NET性能调整之解决Server Too Busy错误
- Spring Cloud Eureka 入门 (三)服务消费者详解
- 廖雪峰python学习笔记——函数式编程
- 在C#程序设计中使用Win32 API
- 动手写了一个12306插件 chrome浏览器
- ngx-material中Datepicker的日期格式化和选择语系
- 中国男性的私密数据大赏,女生勿入!
- 【图解深度学习】【章节:2-1.1 | 什么是机器学习?】连小学生都能看懂的深度学习基础总结
- java环境变量的设置方法_Java环境变量配置方法详解
- mysql嵌套查询实例_MySQL嵌套查询实例详解_MySQL
- Java Ajax技术详解:(一)Ajax 简介
- DDD聚合设计的几个原则的简单讨论
- 使用OOP思想二次封装echarts
- 编程:随机生成1-100之间的数字,如果猜对了结束游戏,如果猜错则继续猜并提示所猜测的数字是大于还是小于所指定的数,最终提示猜对所用的次数。
- 如何在地图上显示多个红包商店 vue
- 全球与中国汽车点火线圈市场深度研究分析报告
- 时间序列分析-预测Apple股票价格
- 正则表达式“\\s+“ 匹配任意空白字符
- javac 和java 的命令
- [antd-mobile]Button组件点击之后无法恢复原样
热门文章
- 《Python编程:从入门到实战》(第2版)学习笔记 第5章 if语句
- AI for Science年度激辩:AlphaFold成功难以复制,数据人才生态建设都是挑战|MEET2023...
- 关于linux的进程中的各个线程cpu占用情况的分析和查看
- 已知每个部门有一个经理,统计输出部门名称、部门总人数、 总工资和部门经理。
- 示例程序009--阙值化(二值化,cvThreshold)
- 【Leetcode刷题Python】40. 组合总和 II
- ArcGIS Pro数据加载学习总结
- 背篼酥课堂第八课--APP开发--app图形化编程
- 公主连结显示服务器内部错误,公主连结Re:Dive无法连接服务器是什么原因
- 特惠快车和快车的区别,滴滴特惠快车老司机说了实话?