4

我正在尝试将高维数据集减少为二维。但是,我无法预先访问整个数据集。所以,我想生成一个函数,它接受一个 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,请询问,我会澄清。

4

3 回答 3

3

SVD 是一种很好的方法(可能)。LSA (Latent Semantic Analysis) 是基于它,并且具有基本相同的维度方法。我已经(详细地)在以下位置讨论过这个问题: lsa-latent-semantic-analysis-how-to-code-it-in-php 或在 SO 上查看 LSA 标签。

我意识到这是一个不完整的答案。如果您需要更多帮助,请大声喊叫!

于 2009-10-08T15:53:11.937 回答
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])
于 2009-10-09T01:08:57.277 回答
0

我认为没有内置方法可以在 Matlab 中更新现有的 SVD。我在谷歌上搜索了“SVD 更新”,并在众多结果中找到了这篇论文。

于 2009-10-09T01:23:51.147 回答