博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求伪逆的五种方法比较
阅读量:3903 次
发布时间:2019-05-23

本文共 1048 字,大约阅读时间需要 3 分钟。

A*x=y当A不可逆如何解x

求伪逆有五种方法,左右同时乘以A’,’chol()分解,qr() 分解,svd()分解和pinv()求伪逆,下面来比较一下哪个最优秀。
如果A是个355行3列的矩阵,经过计算,五个方式计算结果相同,对模型的拟合都是没有影响的。
如果A是个355行12列的矩阵(更高维),那么根据我对数据的拟合,结果如下:
在这里插入图片描述
深蓝线是数据,绿色的线是两边同时×A’,浅蓝色的线是pinv分解拟合出的模型,红线是qr拟合出的模型,黄线是svd分解拟合出的模型。这么浅显的看的话在高维下svd和两边同时×A’胜出,那么他们究竟谁更胜一筹,我们看一下第一范式,第二范式和Inf范式检验的结果:
%两边同时×A’
LINorm: 4310.269307,
degree:12
L2Norm: 304.254326,
degree:12
LinfNorm: 53.894558,
degree:12
%pinv
LINorm_pinv: 280971.201240,
degree:12
L2Norm_pinv: 17769.498396,
degree:12
LinfNorm_pinv: 1418.760946,
degree:12
%qr
LINorm_qr: 15143.093210,
degree:12
L2Norm_qr: 1598.528160,
degree:12
LinfNorm_qr: 384.625312,
degree:12
%svd
LINorm_svd: 4308.538292,
degree:12
L2Norm_svd: 303.776987,
degree:12
LinfNorm_svd: 53.013915,
degree:12
可见在高维情况下是svd分解更胜一筹(范式结果低),低维下不要轻易用两边同时×A’,因为会出奇异矩阵警告。
几种求伪逆的方法如下(matlab代码):

result=(A'*A)\(A'*y) %两边同时乘A’result_pinv=pinv(A)*y %pinv%svd[U,S,V] = svd(A);  T=S; T(find(S~=0)) = 1./S(find(S~=0)); svdInvA = V * T' * U'; alpha_svd=svdInvA*y;  %qr [Q,R] = qr(A);InvR =  inv(R'*R)*R';qrInvA =InvR*Q';alpha_qr=qrInvA*y;

转载地址:http://dpoen.baihongyu.com/

你可能感兴趣的文章
宏定义中#跟##作用
查看>>
初次使用VS2010基于C++开发项目碰到的问题及解决方法
查看>>
error C2664: “CreateFileW”: 不能将参数 1 从“char *”转换为“LPCWSTR”
查看>>
调试串口通用程序的几种技巧
查看>>
GUI 编辑框中读写矩阵
查看>>
matlab成段注释
查看>>
matlab数据的导入和导出,以matlab工作区workspace为source和destination
查看>>
获取字节数
查看>>
福听阅读器 背景色设置
查看>>
保护眼睛 电脑设置
查看>>
【云端3.4 Beta】云端无法启动,从服务器返回了一个参照
查看>>
解决chrome下用google搜索图片第二页以后不显示的问题
查看>>
将163邮箱的通讯录导入到outlook2010
查看>>
winRar过期了,总弹出 “购买……”
查看>>
看过的动漫
查看>>
华硕 P5KPL-AM 前面板耳机没有声音
查看>>
个人常用的Chrome浏览器扩展程序
查看>>
labview 局部变量问题
查看>>
labview 循环外部与数组相连时问题
查看>>
哈佛大学凌晨4点半的景象--哈佛图书馆的二十条训言
查看>>