我在Matlab中有一个75x60数组。我在试着做PCA。我试图通过确保eig(矩阵)返回的最大特征值与u v=svd(矩阵)中的d(1)*d(1)返回相同的内容来检查我的工作。他们太离谱了。我能看到的唯一可能出错的就是贬低。
下面是我如何处理这种贬低的方法:
%v is a 75x60 array
%rowS is 75
avgVector= mean(v,1);
muMatrix = repmat(avgVector,rowS,1);
v = v-muMatrix;
如果我称SVD(v)为SVD(V),它将返回与eig(cov(v))极不相同的值,无论v是否经历了上述的贬低。
发布于 2014-02-03 19:48:19
如果您的矩阵遵循标准的Matlab惯例,即变量是列,样本是行,那么基本上您的方法,
v = v - repmat(mean(v, 1), size(v, 1), 1);
是对的。不过,如果不将方法放大到一个全尺寸的矩阵,那么内存效率就会更高:
v = bsxfun(@minus, v, mean(v, 1));
也有可能使用
v = detrend(v, 'constant')
在内部使用前面的代码。
问题就在别的地方:奇异值 of v
是v'*v
特征值的平方根。如果v
是无均值的,那么v'*v
(在本例中称为“散射矩阵”)与(无偏-估计)协方差矩阵cov(v)
-直到一个因子size(v, 1) - 1
是完全相同的。如果您使用代码
[V, D] = eig(cov(v));
[U, S, V] = svd(bsxfun(@minus, v, mean(v, 1)));
你会发现
sort(diag(D), 'descend')
和
diag(S) .^ 2 / (size(x, 1) - 1)
与四舍五入的误差相同。额外的sort
是必要的,因为eig
不能保证有序的特征值。
https://stackoverflow.com/questions/21506994
复制相似问题