用java实现奇异值分解(SVD)

2023-11-12

首先奇异值分解(Singular Value Decomposition,以下简称SVD)描述如下:

奇异值分解(Singular Value Decomposition)是线性代数中一种重要的矩阵分解,奇异值分解则是特征分解在任意矩阵上的推广。在信号处理,统计学等领域有重要应用。

假设M是一个m×n阶矩阵,其中的元素全部属于域 K,也就是实数域或复数域。如此则存在一个分解使得

其中U是m×m阶矩阵;Σ是半正定m×n阶对角矩阵;而V*,即V的共轭转置,是n×n阶矩阵。这样的分解就称作M的奇异值分解。Σ对角线上的元素Σi,其中Σi即为M的奇异值。

常见的做法是为了奇异值由大而小排列。如此Σ便能由M唯一确定了。(虽然U和V仍然不能确定)

直观的解释

在矩阵M的奇异值分解中

·U的列(columns)组成一套对M的正交"输入"或"分析"的基向量。这些向量是MM*的特征向量。

·V的列(columns)组成一套对M的正交"输出"的基向量。这些向量是M*M的特征向量。

·Σ对角线上的元素是奇异值,可视为是在输入与输出间进行的标量的"膨胀控制"。这些是M*M及MM*的奇异值,并与U和V的列向量相对应。

我们用java实现如下:

首先我们需要用到特征分解,可以参考我之前写的一篇文章,里面使用了雅克比(Jacobi)算法进行特征分解

https://blog.csdn.net/luohualiushui1/article/details/88342768

然后我们实现SVD主方法如下:

	public static DenseMatrix64F[] runSVD(DenseMatrix64F A) {
		
		//求输入矩阵的转置
		DenseMatrix64F A_T = new DenseMatrix64F(A.numCols,A.numRows);
		
		CommonOps.transpose(A, A_T);
		
		//求A.T*A
		DenseMatrix64F ATA = new DenseMatrix64F(A.numCols,A.numCols);
		
		CommonOps.mult(A_T,A,ATA);
		
		
		
		
		//求A*A.T
		DenseMatrix64F AAT = new DenseMatrix64F(A.numRows,A.numRows);
		
		CommonOps.mult(A,A_T,AAT);
		
		
		
		
		EDInfo ATA_de = Jacobi.JacobiCount(ATA,0.001,1000);
		
		EDInfo AAT_de = Jacobi.JacobiCount(AAT,0.001,1000);
		
		
		
		//计算奇异值
		DenseMatrix64F singulars = new DenseMatrix64F(A.numRows,A.numCols);
		
		singulars.zero();
		
		for(int i=0;i<A.numCols;i++) {
			singulars.set(i, i,Math.sqrt(ATA_de.getVectors()[i]));
		}
		
		
		return new DenseMatrix64F[]{AAT_de.getValues(),singulars,ATA_de.getValues()};
	}

然后我们开始测试

		double[][] datas = {{0,1},{1,1},{1,0}};
		
		 DenseMatrix64F[] usv = runSVD(new DenseMatrix64F(datas));
		 
		 System.out.println(usv[0]);
		 System.out.println(usv[1]);
		 System.out.println(usv[2]);

测试结果如下:

这里我们用一个简单的例子来说明矩阵是如何进行奇异值分解的。我们的矩阵A定义为:

 

矩阵依次是U,Σ,V

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用java实现奇异值分解(SVD) 的相关文章

  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • JavaMail Gmail 问题。 “准备启动 TLS”然后失败

    mailServerProperties System getProperties mailServerProperties put mail smtp port 587 mailServerProperties put mail smtp
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • 【华为OD机试 2023】 开放日活动、取出尽量少的球 (C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • svn无法查看日志显示离线问题

    1 如下图所示 查看svn日志时 报只能离线查看 如上图所示点击Show log后 报如下错误 2 解决办法 如下图所示 在svn本地仓库右击 选择TortoiseSVN 点击Revision graph后 等待弹框加载完毕后再关闭 再重新
  • keil5软件安装&开发环境搭建教程(mdk,c51通用)

    这是我在csdn上写的第一篇文章 心情激动兴奋 因为之前都是看别人写的博客 从来没想过自己去写一篇 在学长的鼓励下 尝试完成人生第一篇博客 仍有不足 希望大佬多多指正 写这篇的目的是因为keil5的安装是许多人入门嵌入式的第一步 而且以后遇
  • VSCode插件生成编号、目录、文件目录树

    安装VSCode 官方地址 https code visualstudio com 下载安装完毕后在扩展中安装中文插件Chinese Simplified Markdown自动生成编号和目录 安装插件Markdown All in One
  • 移动距离不超过k的几乎有序的数组进行排序(堆最优解 时间复杂度N*O(K))

    已知一个几乎有序的数组 把数组排好顺序的话 每个元素移动的距离一定不超过k 并且k相对于数组长度来说比较小 1 这道题如果我们不使用的k的条件 正常使用排序的算法 也是可以做的 只是复杂度过高 不是最优解 2 第一眼看到这个问题 感觉情况很
  • 2021-10-02PE文件学习

    欢迎大家一起来Hacking水友攻防实验室学习 渗透测试 代码审计 免杀逆向 实战分享 靶场靶机 求关注 PE文件学习 推荐工具 lord PE stud PE PE权威指南 了解格式 看雪 吾爱破解 EXE是如何组成的 如何逆向一个EXE
  • STM32 GPIO 封装过程

    基本数据类型的封装 define IO volatile lt Defines read write permissions exact width signed integer types typedef signed char int8
  • NSSCTF web 刷题记录2

    文章目录 前言 题目 广东强网杯 2021 团队组 love Pokemon NCTF 2018 Easy Audit 安洵杯 2019 easy web NCTF 2018 全球最大交友网站 prize p2 羊城杯 2020 easys
  • 华为OD机试真题-整理扑克牌【2023.Q1】

    题目内容 给定一组数字 表示扑克牌的牌面数字 忽略扑克牌的花色 请按如下规则对这一组扑克牌进行整理 步骤1 对扑克牌进行分组 形成组合牌 规则如下 当牌面数字相同张数大于等于4时 组合牌为 炸弹 3张相同牌面数字 2张相同牌面数字 且3张牌
  • dell服务器卡在启动界面_戴尔最新bios设置图解 当电脑出现开机画面按F2进入

    导读 提到戴尔 大家应该都不陌生 有朋友问戴尔电脑文档保存之后没了 当然了 还有朋友想问如何进入dell电脑bios设置 这到底是咋回事 其实戴尔 dell 服务器内存条呢 下面是小编精心为你们整理的戴尔最新bios设置图解 让大家少走弯路
  • 2018创业项目

    一 无人驾驶 1 苏州豪米波 毕欣 专注于毫米波雷达和多传感器融合 2 贾冰 31岁 博士 专注于无人驾驶中的自动化数据采集 自动化标注等 3 张文博 33岁 创业2年 垂直行业无人机 空中侦察兵 公安等 4 刘诗聪 27岁 创业1年 自然
  • python实战——JSON转CSV

    这里写自定义目录标题 目标 实现 目标 将json格式的文件转换为csv格式的文件 用python写一个转换器 依赖库 处理json文件需要json库 使用如下命令安装 pip install json 待转换的json文件名为input
  • 字库:cmap 表

    fontTools库来检测字体文件中是否包含某字符 如何判断一个汉字是否在TTF字体中有定义 字库 cmap 表 fontTools库来检测字体文件中是否包含某字符 https blog csdn net alxe made article
  • Servlet学习(七):Cookie

    一 Cookie的基本使用 1 概念 Cookie 客户端会话技术 将数据保存到客户端 以后每次请求都携带Cookie数据进行访问 2 Cookie的工作流程 服务端提供了两个Servlet 分别是ServletA和ServletB 浏览器
  • 涵盖入门到精通,自测 Vue 掌握程度

    文章目录 一 说说对spa单页面的理解 他的缺点是什么 二 v show和v if的区别 三 Class 与 Style 如何动态绑定 四 怎么理解Vue的单向数据流 五 computed 和 watch 的区别和应用的场景 6 直接给一个
  • 枚举的应用你知道多少?

    大家好 我是大成子 今天给大家讲一讲枚举的应用 前言 枚举类型enum是C 中基本的值类型数据类型 适当的用好它 有助于提高代码的简洁性和易读性 枚举语法定义格式为 enum 枚举名 枚举元素1 枚举元素2 应用 在正常的开发中 像人的性别
  • RT-Thread微秒延时?

    今天继续做之前的东西 使用了RT thread操作系统 程序中有AT24C02的相关操作AT24C02的操作的接口是IIC接口 所以又涉及到IIC 程序用的模拟的IIC IIC的时序挺严格的 有微秒的延时操作 由于模拟IIC程序中的延时操作
  • 计算1-100之间的所有的奇数和

    我的每篇都是干货 要求 计算1 100之间的所有的奇数和 1 3 5 7 99 有一个数据 从0变到100 循环 int 0 lt 100 从0 100 范围内 找到奇数 数 2 1 奇数 所有的奇数求和计算 需要变量 保存奇数的求和 实现
  • 想要输出JSONObject有序的操作方法

    1 由于 com alibaba fastjson JSONObject 默认是由hashMap组成的 所以内容存放的顺序并不是有序的 如果要实现有序的话需要使用LinkedHashMap的方式 在新建Json对象的时候要这样写 JSONO
  • 用java实现奇异值分解(SVD)

    首先奇异值分解 Singular Value Decomposition 以下简称SVD 描述如下 奇异值分解 Singular Value Decomposition 是线性代数中一种重要的矩阵分解 奇异值分解则是特征分解在任意矩阵上的推