除了说明显而易见的事情:在降序eig时以升序给出结果svd;svd特征值(和特征向量显然)与eig分解的不同,因为您的矩阵一ingredients开始就不对称。稍微解释一下维基百科:“当X是正规和/或半正定矩阵,分解 X=UDU∗也是一个奇异值分解“,不是其他的。(U是的特征向量XXT)
例如,如果您执行以下操作:
rng(0,'twister') %just set the seed.
Q = random('normal', 0,1,5);
X = Q' * Q; %so X is PSD
[U S V]= svd(X);
[A,B]= eig(X);
max( abs(diag(S)- fliplr(diag(B)')' ))
% ans = 7.1054e-15 % AKA equal to numerical precision.
您会发现svd并eig确实给您返回相同的结果。而之前正是因为矩阵ingredients至少不是 PSD(或者甚至不是正方形),好吧..你没有得到相同的结果。:)
换一种方式来说明:X=UΣV∗实际上转化为:X=∑r1uisivTi(r排名X)。这本身就意味着你(非常棒)被允许写作Xvi=σiui. 清楚地回到特征分解Xui=λiui你首先需要ui==vi. 非正态矩阵不能保证的东西。最后一点:小的数值差异是由于在后台工作的算法不同eig;svd的QR 算法的变体svd和(通常)广义的Schur 分解。eig
针对您的问题,您想要的是类似于:
load hald;
[u s v]=svd(ingredients);
sigma=(ingredients' * ingredients);
lambda =eig(sigma);
max( abs(diag(s)- fliplr(sqrt(lambda)')' ))
% ans = 5.6843e-14
如您所见,这与将数据居中以使其具有意义无关0 此时;矩阵ingredients不居中。
现在,如果您使用协方差矩阵(而不是像我那样使用简单的内积矩阵),则必须将数据居中。假设这ingredients2是您的零均值样本。
ingredients2 = ingredients - repmat(mean(ingredients), 13,1);
那么你确实需要这种标准化1/(n−1)
[u s v] =svd(ingredients2 );
sigma = cov(ingredients); % You don't care about centring here
lambda =eig(sigma);
max( abs( diag(s)- fliplr(sqrt(lambda *12)')')) % n = 13 so multiply by n-1
% ans = 4.7962e-14
所以,是的,它现在是居中的。我最初有点误导,因为我使用的是 PSD 矩阵而不是协方差矩阵的概念。编辑前的答案很好。它准确地解决了为什么您的特征分解不适合您的奇异值分解。通过编辑,我展示了为什么您的奇异值分解不符合特征分解。显然,人们可以用两种不同的方式看待同一个问题。:D