我正在尝试将高维数据集减少到2-D。但是,我不能预先访问整个数据集。所以,我想生成一个函数,它接受一个N维向量,并返回一个2维向量,这样,如果我把它赋给在N维空间中接近的向量,结果在2维空间中是接近的。
我认为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,可以问我,我会澄清的。
发布于 2009-10-08 15:53:12
SVD (可能)是一个很好的方法。LSA (潜在语义分析)就是以此为基础的,并且具有基本相同的维度方法。我已经在lsa-latent-semantic-analysis-how-to-code-it-in-php上(详细地)谈到了这一点,或者在这里查看LSA标签。
我知道这是一个不完整的答案。如果你需要更多的帮助,请大叫!
发布于 2009-10-09 01:08:57
% 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])发布于 2009-10-09 01:23:51
我不认为有一种内置的方法来更新Matlab中现有的SVD。我在谷歌上搜索"SVD update“,在众多结果中找到了this paper。
https://stackoverflow.com/questions/1538656
复制相似问题