本文共 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/