我试图减少一个高维数据集以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,1×3向量。有一种使用U,S,或V转到适当的1x2的向量的方法吗?

如果SVD是一个失败的事业,可有人告诉我,我应该不是做?

请注意:这是Matlab代码,但我不在乎,如果答案是C,Java或数学罢了。如果您无法读取Matlab的,问我会澄清。

有帮助吗?

解决方案

SVD是精细的方法(可能)。 LSA(潜在语义分析),是基于它周围,并具有基本相同的方法维度。我谈到的是(在长度)为: LSA-潜在语义分析知识,TO-码它功能于PHP 或这里检查出LSA标签上SO。

我意识到这是一个不完整的答案。奥莱如果你想要更多的帮助!

其他提示

% 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])

我不认为有更新内Matlab的现有SVD内置方式。我google'd为“SVD更新”,发现之间本文许多结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top