首页
学习
活动
专区
圈层
工具
发布

降维
EN

Stack Overflow用户
提问于 2009-10-08 15:47:11
回答 3查看 3.5K关注 0票数 4

我正在尝试将高维数据集减少到2-D。但是,我不能预先访问整个数据集。所以,我想生成一个函数,它接受一个N维向量,并返回一个2维向量,这样,如果我把它赋给在N维空间中接近的向量,结果在2维空间中是接近的。

我认为SVD是我需要的答案,但我不能让它工作。

为了简单起见,让N=3和假设我有15个数据点。如果我将所有数据预先存储在15x3矩阵X中,那么:

代码语言:javascript
复制
[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,可以问我,我会澄清的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-08 15:53:12

SVD (可能)是一个很好的方法。LSA (潜在语义分析)就是以此为基础的,并且具有基本相同的维度方法。我已经在lsa-latent-semantic-analysis-how-to-code-it-in-php上(详细地)谈到了这一点,或者在这里查看LSA标签。

我知道这是一个不完整的答案。如果你需要更多的帮助,请大叫!

票数 3
EN

Stack Overflow用户

发布于 2009-10-09 01:08:57

代码语言:javascript
复制
% 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
EN

Stack Overflow用户

发布于 2009-10-09 01:23:51

我不认为有一种内置的方法来更新Matlab中现有的SVD。我在谷歌上搜索"SVD update“,在众多结果中找到了this paper

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1538656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档