基于Spark框架的大型分布式矩阵求逆运算实现(二)——大型下三角矩阵求逆运算

article/2025/9/19 18:25:40

基于实际需要,需要对五百万阶的方阵进行求逆运算,但查看Spark(v. 2.2.0)的官方api并没有此方面的信息,就自己尝试着实现了一个;

先说一下原理:

        对于一个可逆矩阵A,必然会得到它的唯一LU分解,即分解为一个下三角矩阵L和一个上三角矩阵U使得 A=L*U;

        我们需要求得的问题是A的逆矩阵A`,已知 A=LU,A*A`=E,所以 A` = U`*L`;

        由线性代数知识可知,一个下三角矩阵的逆必然也是下三角矩阵;

        又因为,逆的转置等于转置的逆,即,(U`)T = (UT),而UT和L一样是下三角矩阵,可以实现代码复用;

所以问题便转化成了,

    (一)大型可逆矩阵的LU分解

    (二)大型下三角矩阵的求逆

第一部分由我的同学实现,之后会放出链接;这里主要讲一下大型下三角矩阵求逆的方法和实现;


大型矩阵运算,因为数据量过大,无法在单台计算机上进行,故需要进行并行化处理,这里采用分块矩阵乘法的思想。

首先设定一个步长 s,使得阶数为s的方阵可以在单台节点上进行求逆运算。


根据分块矩阵乘法,

    L1*L1`=E

    L2*L1`+L3*L2`=0

    L3*L3`=E

化简可知,

    L1`=(L1)`

    L2`=-(L3)`*L2*(L1)`

    L3`=(L3)`

如此一来。只要知道(L3)`,便可以知道整个矩阵的逆,而(L3)`同样是下三角矩阵,如此一来便可以进行迭代,当迭代到L3的步长不大于s时,便可以在单台节点上进行计算,如此一来,便可以反推回整个矩阵的逆;


下面进入实际实现部分:

    1.基于Spark的api,将HDFS上的矩阵加载到内存中,类型为 BlockMatrix

 2.调用BlockMatrix.blocks方法得到底层RDD,过滤出行标不大于列标的分块(下三角矩阵上半部分全是0,减少运算量)

 3.首先得到原矩阵右下角的分块,求逆得到(L3)`,行标-1,得到L1和L2,得到(L1)`和L2,如此一来便可以拼凑出原矩阵右下角分块为2的矩阵的逆,迭代运算便可得到最终结果;

    

期间遇到的难点:

    1.矩阵加载,Spark提供的原生api无法加载CSV文件直接转成BlockMatrix,所以此处进行了封装:

new IndexedRowMatrix(spark.sparkContext.textFile(path,Main.excutors).map(UDF.line2IndexedRow)).toCoordinateMatrix().toBlockMatrix(steps, steps)
 
/*
 *输入一行以逗号(英文 , )分割的浮点数,最开始的数字作为索引
 *返回一个IndexRow
 */
def line2IndexedRow(line:String): IndexedRow ={val arrayBuffer = line.split(",").map(_.toDouble).toBufferval index = arrayBuffer.head.toLongarrayBuffer.trimStart(1)val vector = Vectors.dense(arrayBuffer.toArray)new IndexedRow(index,vector)
}
 

2.在计算  L2`=-(L3)`*L2*(L1)`时,由于直接调用矩阵分块乘法api会导致分块最终位置与算法设想不同,需要自行解决;

3.在本地运行时结果与集群运行结果不一致:由于算法全程使用尾递归进行迭代,有部分全局变量需要广播到各个节点;

4.性能优化,在矩阵运算过程中,由于是懒执行,部分变量会重复计算造成计算资源浪费,需要在SparkUI上查看,逐项调校;

5.Spark的persist机制:在调用RDD的persist方法后,RDD并不会马上被缓存,而是要等到第一个action调用时才会执行,但实际上

本算法中action的调用距离RDD首次生成相隔甚远,所以,需要在persist方法后接一个action来进行显示缓存;由于缓存项目过多

可能造成大量IO操作,需要及时进行unpersist操作;

优化后的RDD DAG截图如下:


可以看到,大部分的RDD操作由于缓存,节省了大量计算资源;

测试结果表明,在计算20阶,步长为5的矩阵运算时,优化前的计算时间为36.39秒;

优化后,将时间缩减到10.809秒,优化成果显著;




    




http://chatgpt.dhexx.cn/article/LaYqEQKA.shtml

相关文章

一文看懂大数据矩阵运算利器-Spark Distributed Matrix

如今是大数据的时代,数据呈指数型增长,那么如何利用这些数据?离不开大数据计算,今天小普给大家介绍的是:Spark的分布式计算框架,它能很好地适配大数据场景下的计算任务。 【相似度计算】是金融领域或商品推…

紧跟时代步伐,朗强HDMI分布式矩阵可以通过手机来控制

近年来,随着AV与IT不断的深入融合,分布式技术成为信号处理行业的一大热点。朗强科技作为音视频信号行业领导者,一直以来不断加大研发力度,不断推出引领市场潮流的产品。现隆重推出一款集大屏拼接、显示控制功能于一体的分布式矩阵…

朗强:紧跟时代步伐!HDMI分布式矩阵可以通过手机来控制!

近年来,随着AV与IT不断的深入融合,分布式技术成为信号处理行业的一大热点。朗强科技作为音视频信号行业领导者,一直以来不断加大研发力度,不断推出引领市场潮流的产品。现隆重推出一款集大屏拼接、显示控制功能于一体的分布式矩阵…

编码分布式矩阵乘法(Coded Distributed Matrix Multiplication, CDMM)问题简单介绍

许多现代分布式计算框架都会遇到大规模分布式矩阵乘法问题,即计算两个大规模矩阵和的乘积,如MapReduce、Spark。由于分布式计算系统会出现的无法预测的时延,主节点(master node)必须等到最慢的工作节点(worker node)完…

手把手推导分布式矩阵乘的最优并行策略

作者|郭冉、李一鹏、柳俊丞、袁进辉 常用深度学习框架的自动并行机制还不够完善,还需要用户根据经验来配置并行方式,这给开发者带来了不小的智力负担。因此,实现自动最优并行就成为一个有趣的课题。 矩阵乘是深度学习最常用的底层…

CAP原理应用与分布式矩阵

CAP原理是描述一致性,可用性,和分区兼容性的理论,但这个原理用在实际情况下时往往让人很困惑。什么样的情况适用于这样的原理?有哪些先决条件?如何创建一个同时满足一致性和可用性,分区兼容性的分布式系统&…

【Scala-spark.mlib】分布式矩阵——分布式计算的基石与利器

分布式矩阵 1. mlib.linalg.distributed包2. DistributedMatrix特质3. BlockMatrix类4. CoordinateMatrix类5. IndexedRowMatrix类6. RowMatrix类7. 小结 1. mlib.linalg.distributed包 矩阵计算是很多科学计算的重要步骤,而分布式矩阵存储则是分布式计算的基础。根…

Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)...

不多说,直接上干货! Distributed matrix : 分布式矩阵  一般能采用分布式矩阵,说明这数据存储下来,量还是有一定的。在Spark Mllib里,提供了四种分布式矩阵存储形式,均由支持长整形的行列数和…

Shiro权限管理详解(授权和注解开发)【面试点】

Shiro权限管理详解 1. 权限管理1.1什么是权限管理1.2用户身份认证1.2.1 概念1.2.2 用户名密码身份认证流程1.2.3 关键对象 1.3 授权1.3.1 概念 1.3.2 授权流程1.3.3 关键对象1.3.4 权限模型1.3.5 权限分配1.3.6 权限控制1.3.6.1 基于角色的访问控制 1. 权限管理 1.1什么是权限…

Shiro权限管理之自定义Realm

文章目录 1. SpringBoot集成shiro快速入门1. shiro 用户认证2. shiro用户授权 2. SpringBoot 使用IniRealm进行认证授权3. Spring Boot 使用 JdbcRealm 进行认证授权1. 数据库驱动2. 数据库表结构3. 创建 testJdbcRealm方法4. 更改数据库表名 4. Spring Boot 使用自定义 Realm …

权限管理框架Shiro简介

Shiro 1、shiro简介 shiro是一个强大易用的java安全框架,可以帮助我们完成:身份认证、授权、加密、会话管理、与web集成、缓存等。 包括了三个核心组件:Subject、SecurityManage和Realm 外部架构 内部架构 authentication(认证…

Java shiro权限管理框架视频教程

shiro权限管理框架视频教程 中级 共14课 权限系统在任何一个系统中都存在,随着分布式系统的大行其道,权限系统也趋向服务化,对于一个高级工程师来说,权限系统的设计是必不可少需要掌握的技术栈。 课程简介 权限系统在任何一个…

【Shiro权限管理】一、简介

一、简介 Apache Shiro 是Java 的一个安全框架。Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与Web 集成、缓存等。 官网地址&#xf…

SSM集成shiro权限管理

这几天在学习了shiro权限管理框架,在刚开始的时候学的时候因为这个配置问题困扰了我很长时间,所以在这篇文章我整合了自己用SSM搭建shiro权限框架的过程。 1.配置 1.1jar包 在项目配置开始前需要先导入shiro的相关jar包,下载地址&#xff1a…

shiro权限管理的应用

shiro权限管理的应用 官网:http://shiro.apache.org 一, 什么是权限管理: 对系统中的资源进行权限配置 , 对资源的一种保护 ; 一般需要进过两个步骤: 身份认证- 授权 - 资源访问; 1.1 身份认证&…

shiro权限管理框架简介(一)

一:什么是shiro? shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。 spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单。 s…

shiro权限管理框架学习

一、权限框架简介 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。权限管理包括用户身份认证和授权两…

shiro权限管理的配置

建立一个权限管理配置类,在类上添加注解Configuration,如下: 1、设置安全管理 Bean public DefaultWebSecurityManager securityManager(CookieRememberMeManager rememberMeManager, CacheManager cacheShiroManager, SessionManager sessio…

Shiro 权限管理入门之认证与授权

Shiro 权限管理什么是权限管理?什么是身份认证?什么是授权? Shiro 是什么?Shiro 的核心架构Shiro 中的认证认证关键对象认证流程认证的开发自定义 RealmSimpleAccountRealm开发自定义 Realm MD5 和 Salt自定义 md5 salt 的 Realm 并验证 Sh…

Shiro权限管理详解

1权限管理1.1什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用户身份…