簡體   English   中英

尺寸減小

[英]Dimension Reduction

我正在嘗試將高維數據集縮減為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,請詢問並澄清。

SVD是一種很好的方法(可能)。 LSA(潛在語義分析)基於它,並且具有基本相同的維度方法。 我已經談到了(最后): lsa-latent-semantic-analysis-how-to-code-it-in-php或者在SO上查看LSA標簽。

我意識到這是一個不完整的答案。 霍勒,如果你想要更多的幫助!

% 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沒有內置的方法。 我谷歌為“SVD更新”,並在許多結果中發現了這篇論文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM