cholesky分解

接着LU分解继续往下,就会发展出很多相关但是并不完全一样的矩阵分解,最后对于对称正定矩阵,我们则可以给出非常有用的cholesky分解。这些分解的来源就在于矩阵本身存在的特殊的

结构。对于矩阵A,如果没有任何的特殊结构,那么可以给出A=L*U分解,其中L是下三角矩阵且对角线全部为1,U是上三角矩阵但是对角线的值任意,将U正规化成对角线为1的矩阵,产生分解A
= L*D*U,
D为对角矩阵。如果A为对称矩阵,那么会产生A=L*D*L分解。如果A为正定对称矩阵,那么就会产生A=G*G,可以这么理解G=L*sqrt(D)。

A=L*D*U分解对应的Matlab代码如下:

function[L,
D, U] =zldu(A)

%LDU
decomposition of square matrix A. The first step for Cholesky

%decomposition

[m, n] = size(A);

if
m ~= n

error(‘support
square matrix only‘)

end

L = eye(n);

U = eye(n);

d = zeros(n,1);

for
k=1:n

v =
zeros(n, 1);

if k == 1

v(k:end) = A(k:end, k);

else

m = L(1:k-1, 1:k-1) \
A(1:k-1, k);

for j
= 1:k-1

U(j, k)
= m(j) /
d(j);

end

v(k:end) = A(k:end, k) -
L(k:end, 1:k-1)*m(:);

end

d(k) = v(k);

if k < n

L(k+1:end, k) = v(k+1:end)/v(k);

end

end

D = diag(d);

分解的稳定性和精度结果如下:

mean of my lu
    : 9.0307e-15

variance of my lu
: 4.17441e-27

mean of matlab lu
    : 3.70519e-16

variance of
matlab lu : 2.07393e-32

这里的计算是基于Gaxpy,所以稳定性和精确度相当之好。

A=L*D*L分解对应代码如下,这里要求A必须为对称矩阵:

function[D,
L] =zldl(A)

%A
= L*D*L‘ another version of LU decomposition for matrix A

[m, n] = size(A);

if
m ~= n

error(‘support
square matrix only‘)

end

L = eye(n);

d = zeros(n,1);

for
k=1:n

v =
zeros(n,1);

for j=1:k-1

v(j) = L(k, j)*d(j);

end

v(k) = A(k,k) - L(k, 1:k-1)*v(1:k-1);

d(k) = v(k);

L(k+1:end, k) = (A(k+1:end,k)
- A(k+1:end,
1:k-1)*v(1:k-1)) /
v(k);

end

D = diag(d);

对应分解的精确度和稳定度如下:

mean of my lu : 35.264
variance of my lu : 29011.2
mean of matlab lu :
5.88824e-16
variance of matlab lu : 8.40037e-32

使用如下的代码做测试:

n = 1500;

my_error = zeros(1,
n);

sys_error = zeros(1,
n);

for
i = 1:n

test = gensys(5);

[zd, zl] = zldl(test);

[l,
d] = ldl(test);

my_error(i) = norm(zl*zd*(zl‘) - test, ‘fro‘);

sys_error(i) = norm(l*d*(l‘) - test, ‘fro‘);

end

fprintf(‘mean of my lu     :
%g\n‘, mean(my_error));

fprintf(‘variance of my lu :
%g\n‘, var(my_error));

fprintf(‘mean of matlab lu  
  : %g\n‘,
mean(sys_error));

fprintf(‘variance of matlab lu :
%g\n‘, var(sys_error));

对于运算的精度如此之低的原因并不清楚

A=G*G’;
cholesky分解对应的代码如下:

function[G]
=zgaxpychol(A)

%cholesky
decomposition for symmetric positive definite matrix

%the
only requirement is matrix A: symmetric positive definite

[m, n] = size(A);

if
m ~= n

error(‘support
square matrix only‘)

end

G = eye(n);

for
k=1:n

v =
A(:,k);

if k > 1

v(:) = v(:) -
G(:,1:k-1)*G(k,1:k-1)‘;

end

G(k:end, k) =
v(k:end) / sqrt(v(k));

end

对应的测试结果如下

mean of my lu : 1.10711e-15
variance of my lu : 3.04741e-31
mean of
matlab lu : 5.5205e-16
variance of matlab lu : 9.64928e-32

自己代码的精确度和稳定性可以媲美Matlab的代码,产生这种结果的原因应该是positive sysmetric definite
matrix的原因,这段代码基于gaxpy的结果,下面给出另外一种基于外积的运算结果。

function[G] =zopchol(A)

%cholesky
decomposition based on rank-1 matrix update

[m, n] = size(A);

if
m ~= n

error(‘support
square matrix only‘)

end

G = zeros(n);

for
k=1:n

G(k,k) = sqrt(A(k,k));

G(k+1:end, k) = A(k+1:end,
k) / G(k,k);

%update matrix A

for j
= (k+1):n

A(k+1:end,j)
= A(k+1:end,j)
- G(j,k)*G(k+1:end,k);

end

end

对应的测试结果如下:

mean of my lu : 9.33114e-16
variance of my lu : 1.71179e-31
mean of
matlab lu : 9.92241e-16
variance of matlab lu : 1.60667e-31

对应的测试程序如下,这里使用系统自带的chol函数完成cholesky分解。

n = 1500;

my_error = zeros(1,
n);

sys_error = zeros(1,
n);

for
i = 1:n

test = genpd(5);

[zg] = zopchol(test);

l =
chol(test, ‘lower‘);

my_error(i) = norm(zg*(zg‘) - test, ‘fro‘);

sys_error(i) = norm(l*(l‘) - test, ‘fro‘);

end

fprintf(‘mean of my lu     :
%g\n‘, mean(my_error));

fprintf(‘variance of my lu :
%g\n‘, var(my_error));

fprintf(‘mean of matlab lu  
  : %g\n‘,
mean(sys_error));

fprintf(‘variance of matlab lu :
%g\n‘, var(sys_error));

将两个结果想比较,可以发现两个版本的cholesky分解的精确度和稳定度差不多。

Cholesky分解的核心在于矩阵对称正定的结构,基于LU分解的再次扩展。

cholesky分解,布布扣,bubuko.com

时间: 2024-08-01 22:43:14

cholesky分解的相关文章

QR分解

从矩阵分解的角度来看,LU和Cholesky分解目标在于将矩阵转化为三角矩阵的乘积,所以在LAPACK种对应的名称是trf(Triangular Factorization).QR分解的目的在于将矩阵转化成正交矩阵和上三角矩阵的乘积,对应的分解公式是A=Q*R.正交矩阵有很多良好的性质,比如矩阵的逆和矩阵的转置相同,任意一个向量和正交矩阵的乘积不改变向量的2范数等等.QR分解可以用于求解线性方程组,线性拟合.更重要的是QR分解是QR算法的基础,可以用于各种特征值问题,所以QR分集的应用非常广泛.

【Math for ML】矩阵分解(Matrix Decompositions) (上)

I. 行列式(Determinants)和迹(Trace) 1. 行列式(Determinants) 为避免和绝对值符号混淆,本文一般使用\(det(A)\)来表示矩阵\(A\)的行列式.另外这里的\(A∈R^{n×n}\)默认是方阵,因为只有方阵才能计算行列式. 行列式如何计算的就不在这里赘述了,下面简要给出行列式的各种性质和定理. 定理1:当且仅当一个方阵的行列式不为0,则该方阵可逆. 定理2:方阵\(A\)的行列式可沿着某一行或某一列的元素展开,形式如下: 沿着第\(i\)行展开:\[de

『TensorFlow』函数查询列表_数值计算

基本算术运算 操作 描述 tf.add(x, y, name=None) 求和 tf.sub(x, y, name=None) 减法 tf.mul(x, y, name=None) 乘法 tf.div(x, y, name=None) 除法 tf.mod(x, y, name=None) 取模 tf.abs(x, name=None) 求绝对值 tf.neg(x, name=None) 取负 (y = -x). tf.sign(x, name=None) 返回符号 y = sign(x) = -

共轭梯度法

共轭梯度法(英语:Conjugate gradient method),是求解数学特定线性方程组的数值解的方法,其中那些矩阵为对称和正定.共轭梯度法是一个迭代方法,它适用于稀疏矩阵线性方程组,因为这些系统对于像Cholesky分解这样的直接方法太大了.这种方程组在数值求解偏微分方程时很常见. 共轭梯度法也可以用于求解无约束的最优化问题. 双共轭梯度法提供了一种处理非对称矩阵情况的推广. 方法的表述 设我们要求解下列线性系统 , 其中n-×-n矩阵A是对称的(也即,AT = A),正定的(也即,x

Matlab 矩阵运算

1.Syms 和sym的区别: syms是定义多个符号是符号变量的意思 sym只能定义一个符号变量,但可以具体到这个符号变量的内容 例:syms f z; %定义下x和y f=sym('a+b+c'); %就只能定义一个f=a+b+c syms可以直接声明符号函数d(r),并且可以对函数的形式进行赋值改变,但是sym却不可以 例:>> syms d(r) >> d=r^2 d =r^2 >> sym d(t) ans =d(t) >> d=t^2 Undef

Scipy学习笔记 矩阵计算

Scipy学习笔记 非本人原创  原链接 http://blog.sina.com.cn/s/blog_70586e000100moen.html 1.逆矩阵的求解 >>>import scipy >>>from scipy import linalg >>>a=scipy.mat('[1 2 3;2 2 1;3 4 3]') >>>b=linalg.inv(a) >>>print b 输出结果 [[ 1.   3.

Python金融应用编程(数据分析、定价与量化投资)

近年来,金融领域的量化分析越来越受到理论界与实务界的重视,量化分析的技术也取得了较大的进展,成为备受关注的一个热点领域.所谓金融量化,就是将金融分析理论与计算机编程技术相结合,更为有效的利用现代计算技术实现准确的金融资产定价以及交易机会的发现.量化分析目前已经涉及到金融领域的方方面面,包括基础和衍生金融资产定价.风险管理.量化投资等.随着大数据技术的发展,量化分析还逐步与大数据结合在一起,对海量金融数据实现有效和快速的运算与处理. 在量化金融的时代,选用一种合适的编程语言对于金融模型的实现是至关

ffmpeg文档16-音频编码器

16 音频编码器 介绍当前可用的音频编码器 aac AAC(Advanced Audio Coding )编码器 当前原生(内置)编码器还处于实验阶段,而且只能支持AAC-LC(低复杂度AAC).要使用这个编码器,必须选择 ‘experimental’或者'lower' 因为当前还处于实验期,所以很多意外可能发生.如果需要一个更稳定的AAC编码器,参考libvo-aacenc,然而它也有一些负面报告. aac选项 b 设置码率,单位是bits/s,是自动恒定比特率(CBR)模式的码率 q 设置为

总体最小二乘(TLS)

对于见得多了的东西,我往往就习以为常了,慢慢的就默认了它的存在,而不去思考内在的一些道理.总体最小二乘是一种推广最小二乘方法,本文的主要内容参考张贤达的<矩阵分析与应用>. 1. 最小二乘法 最小二乘法,大家都很熟悉,用在解决一超定方程.最小“二”乘的“二”体现在准则上——令误差的平方和最小,等价于 最小二乘解为(非奇异) 可以从多个角度来理解最小二乘方法,譬如从几何方面考虑,利用正交性原理导出. Steven M.Kay 的<统计信号处理—估计理论>中是这样介绍最小二乘估计的:最