我正在尝试将高维数据集缩减为2-D。但是,我无法预先访问整个数据集。所以,我想生成一个采用N维向量并返回二维向量的函数,这样如果我将它赋予在N维空间中接近的向量,结果就会接近二维空间。
我认为SVD是我需要的答案,但我不能让它发挥作用。
为简单起见,设N = 3,假设我有15个数据点。如果我在15x3矩阵X中预先获得所有数据,那么:
[U, S, V] = svd(X);
s = S; %s is a the reduced version of S, since matlab is case-sensitive.
s(3:end,3:end)=0;
Y=U*s;
Y=Y(1:2,:);
做我想要的。但是假设我得到一个新的数据点,A,1x3向量。有没有办法使用U,S或V将A转换为适当的1x2向量?
如果SVD是一个失败的原因,有人可以告诉我我应该做什么吗?
注意:这是Matlab代码,但我不在乎答案是C,Java还是数学。如果您无法阅读Matlab,请询问并澄清。
答案 0 :(得分:3)
SVD是一种很好的方法(可能)。 LSA(潜在语义分析)基于它,并且具有基本相同的维度方法。我已经谈过(最后): lsa-latent-semantic-analysis-how-to-code-it-in-php或在SO上查看LSA标记。</ p>
我意识到这是一个不完整的答案。霍勒,如果你想要更多的帮助!
答案 1 :(得分:2)
% generate some random data (each row is a d-dimensional datapoint)
%data = rand(200, 4);
load fisheriris
data = meas; % 150 instances of 4-dim
% center data
X = bsxfun(@minus, data, mean(data));
% SVD
[U S V] = svd(X, 'econ'); % X = U*S*V''
% lets keep k-components so that 95% of the data variance is explained
variances = diag(S).^2 / (size(X,1)-1);
varExplained = 100 * variances./sum(variances);
index = 1+sum(~(cumsum(varExplained)>95));
% projected data = X*V = U*S
newX = X * V(:,1:index);
biplot(V(:,1:index), 'scores',newX, 'varlabels',{'d1' 'd2' 'd3' 'd4'});
% mapping function (x is a row vector, or a matrix with multiple rows vectors)
mapFunc = @(x) x * V(:,1:index);
mapFunc([1 2 3 4])
答案 2 :(得分:0)
我认为在Matlab中更新现有的SVD没有内置的方法。我谷歌了解“SVD更新”,并在众多结果中找到了this paper。