矩阵乘积的前导特征向量的有效计算A D一种吨ADAT, 在哪里DD是对角线

计算科学 线性代数 矩阵 算法 特征值
2021-12-26 05:06:33

A=[A1||Am]Rn×mnm1D=diag(d1,,dm)在哪里d1,,dm>0,并考虑n×n正定矩阵X=i=1mdiAiAiT=ADAT.

什么是计算领先特征向量的有效方法X不形成产品ADAT?

1个回答

假设乘以对角矩阵在计算上很容易,我们可以将其写为:

ADAT=(AD)(DTAT)=BBT
在哪里B=AD. 动机是因为左奇异向量B是一组正交特征向量BBT,我们可以进一步进行:
B=UΣVT
第一列mU(对应于m最高奇异值)应对应于第一个m的特征向量ADAT. 由于您只需要领先的特征向量,这就足够了。

这是一个简短的 MATLAB 代码来实现这个想法:

m = 5; d = 3;
A = randn(m,d); % A is a random matrix - note that it can have negatives
D = diag(rand(d,1)); % just a random diagonal that is positive
[V, ~] = eigs(A*D*A', d); % what we actually like to have
[U, ~, ~] = svd(A*sqrt(D),'eco'); % the variant avoiding the product

上面代码的示例运行产生以下UV

U=[0.42760.07460.65730.30010.27360.67970.54690.50830.15030.40680.05790.27300.51240.81110.0941]V=[0.42760.07460.65730.30010.27360.67970.54690.50830.15030.40680.05790.27300.51240.81110.0941]

注意符号歧义。无论如何,向量的符号对于特征分解都是任意的。如果您想获得单个前导特征向量,另一种选择是直接将最后一行替换为:

[U, ~, ~] = svds(A*sqrt(D),1);