详细解读Cholesky分解

简介: 详细解读Cholesky分解

1、为什么要进行矩阵分解

个人认为,首先,当数据量很大时,将一个矩阵分解为若干个矩阵的乘积可以大大降低存储空间;其次,可以减少真正进行问题处理时的计算量,毕竟算法扫描的元//代码效果参考:http://www.ezhiqi.com/bx/art_7429.html 素越少完成任务的速度越快,这个时候矩阵的分解是对数据的一个预处理;再次,矩阵分解可以高效和有效的解决某些问题;最后,矩阵分解可以提高算法数值稳定性,关于这一点可以有进一步的说明,

借用一个上学时老师给的例子:

有方程组:

令 , ,

解方程组可得:

现在对b进行微小扰动:

,扰动项为:

此时相应的解为:

这个例子说明,当方程组常数项发生微小变动的时候会导致求出的结果差别相当大,而导致这种差别的并不是求解方法,而是方程组系数矩阵本身的问题,这会给我们解决问题带来很大危害,例如,我们在用计算机求解这类问题时难以避免在计算当中出现舍入误差,如果矩阵本身性质不好会直接导致所答非所问。

对常数向量b和矩阵A进行一个简单的扰动分析:

1)、扰动b,原方程组为:

(式子1),(,A非奇异)

扰动后为:

(式子2)

把式子1带入式子2得:,用2-范式来衡量这种变化得:,由于,于是得到:

而利用式子1同理可得,整理后得:

,可见b的扰动对解的影响由决定。

2)、扰动A,扰动后为:

(式子3),(,A非奇异)

稍微做一下变换:

把式子1带入后得到:

对两边同时取2-范式有:

于是有:

,整理一下就是:

//代码效果参考:http://www.ezhiqi.com/zx/art_4506.html

,A的扰动对解的影响依然是由决定。

3)、对于同时扰动A和b的情况偶就不推了,最后的结果依然是,扰动对解的影响依然由决定。

定义矩阵的条件数来描述矩阵的病态程度,一般认为条件数小于100为良态,条件数在100到1000之间为中等程度的病态,条件数超过1000存在严重病态。以上面的矩阵A为例,采用2-范数表示的条件数为:,看来矩阵处于中等病态程度。

矩阵其实就是一个给定的线性变换,特征向量描述了这个线性变换的主要方向,而特征值描述了一个特征向量的长度在该线性变换下缩放的比例,有关特征值和特征向量的相关概念可查看对开篇的例子进一步观察发现,A是个对称正定矩阵,A的特征值分别为:14.93303437 和:0.06696563,两个特征值在数量级上相差很大,这意味着b发生扰动时,向量x在这两个特征向量方向上的移动距离是相差很大的——对于对应的特征向量只需要微小的移动就可到达b的新值,而对于,由于它比起太小了,因此需要x做大幅度移动才能到达b的新值,于是悲剧就发生了……………..。

关于矩阵可以有以下各种分解方式,①矩阵的三角分解(Cholesky分解、LU分解等),②矩阵的正交三角分解(QR分解等),③矩阵的满秩分解,④矩阵的奇异值分解(SVD)(关于SVD可以查看高人LeftNotEasy的一文以及他提供的参考资料)。

再看矩阵A,它是个对称正定矩阵,对这种矩阵都可以进行Cholesky分解,也就是将矩阵A分解为:,其中为一个下三角矩阵,具体操作随后讨论,回头看方程组,它就变成了:

将它看成两个方程组:

和,其中:,特征值为:2.2360680和:0.4472136

此时采用2-范数表示的条件数为,显然上面这两个方程组也都是良态的且只需要存储矩阵的下三角部分即可,矩阵分解的优点可见一斑。

2、实正定Hermit矩阵的完全Cholesky分解

设矩阵A有如下形式:

借用中的推导:

令,在第i次迭代时有:

,其中为i-1维单位矩阵

定义矩阵:

于是要满足,就有:

这样一直迭代下去,直到,也就是有:,最后得到分解后的下三角矩阵的元素:

j" src="">

当然也可以是上三角矩阵,此时

所以的元素是:

i" src="">

一种比较直白的分解算法可以是这样的:

设有实对称矩阵:

以及向量和保存分解结果的矩阵,算法伪码描述如下:

1: for i:=1 to n do //逐行计算L的值,w向量初始状态为实hermit矩阵A的上三角部分的一行

2: w(i .. n) := a(i,i .. n);

3: for k:=1 to i-1 do

4: temp := L(k,i);

5: if(temp != 0) then

6: w(i .. n) := w(i .. n) - temp*L(k,i .. n); //计算L(i,j)公式的分子部分

7: endif;

8: endfor;

9: w(i) := sqrt(w(i)); //L矩阵对角线元素计算

10: w(i+1 .. n) := w(i+1 .. n) / w(i); //L矩阵非对角线元素计算

11:

12: L(i,i .. n) := w(i .. n); //更新L矩阵

13: w(i .. n) //清空w向量

14: endfor;

一个简单的实现如下:

1: //串行完全Chlolesky分解,时间复杂度(O(n^3))

2: double **complete_cholesky_decompose(double **A)

3: {

4: if(NULL==A)

5: return NULL;

6:

7: double **L=malloc_matrix();

8: clear_matrix(L);

9:

10: int i,j,k,m;

11:

12: double *w=malloc_vector();

13:

14: clear_vector(w);//清除向量

15:

相关文章
|
弹性计算 安全 Linux
阿里云服务器购买图文教程参考,四种购买阿里云服务器的方式及适用场景分享
阿里云服务器如何购买?目前主要的购买方式有自定义购买、快速购买、通过活动购买、通过云市场镜像页面购买这四种购买方式,每种方式都有主要的适合对象,购买流程也不是完全一样的。例如想要快速购买的用户,一般选择快速购买、通过活动购买最好,如果是想购买的云服务器已经部署好一些自己项目运行所需的各种环境和软件,则选择通过云市场镜像页面购买这种方式更好。本文为以图文形式为大家展示四种购买阿里云服务器的方式及适用场景,以供参考。
阿里云服务器购买图文教程参考,四种购买阿里云服务器的方式及适用场景分享
|
编译器 Linux C语言
【CMake install目录解析】CMake 深度解析:实现精准、高效的项目构建与安装
【CMake install目录解析】CMake 深度解析:实现精准、高效的项目构建与安装
1486 0
|
2月前
|
数据采集 机器人 jenkins
Dify工作流实战:一键自动生成测试报告并推送钉钉,我每天白赚1小时
曾每日耗时1.5小时手动整理测试报告,现通过Dify搭建自动化工作流,仅需18分钟即可完成数据采集、分析与推送。集成Jira、Jenkins等平台,实现一键生成智能报告,大幅提升效率与准确性,释放测试人员创造力。
|
JavaScript 前端开发 数据可视化
Py之mpld3:mpld3的简介、安装、使用方法之详细攻略
Py之mpld3:mpld3的简介、安装、使用方法之详细攻略
Py之mpld3:mpld3的简介、安装、使用方法之详细攻略
|
存储 安全 测试技术
渗透测试之白盒测试:一种深入的安全性评估方法
渗透测试中的白盒测试是一种利用系统详细信息(如源代码、数据库结构和网络拓扑)进行深度安全评估的方法。通过源代码审查、数据库分析和网络拓扑研究,测试人员能更准确地发现漏洞并提高测试效率。尽管白盒测试能深入揭露潜在威胁,但也面临信息获取难、代码理解复杂及对测试人员高技能要求的挑战。
渗透测试之白盒测试:一种深入的安全性评估方法
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
561 0
|
人工智能 测试技术 Python
基于 LangChain 的自动化测试用例的生成与执行
本章节详细介绍了如何利用人工智能技术自动化完成Web、App及接口测试用例的生成与执行过程,避免了手动粘贴和调整测试用例的繁琐操作。通过封装工具包与Agent,不仅提升了测试效率,还实现了从生成到执行的一体化流程。应用价值在于显著节省时间并提高测试自动化水平。
|
机器学习/深度学习 算法 数据可视化
【机器学习】比较分层聚类(Hierarchical Clustering)和K-means聚类算法
【5月更文挑战第12天】【机器学习】比较分层聚类(Hierarchical Clustering)和K-means聚类算法
|
机器学习/深度学习 算法 数据挖掘
最优化--梯度下降法--牛顿法(详解)
最优化--梯度下降法--牛顿法(详解)
2078 1
|
存储 安全 Java
《ThreadLocal使用与学习总结:》史上最详细由浅入深解析ThreadLocal
《ThreadLocal使用与学习总结:》史上最详细由浅入深解析ThreadLocal
219 0