2009-10-08 209 views
4

我試圖將高維數據集減少到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,請問,我會澄清。

+2

呃,s和s真的會欺騙眼睛。 ;) – 2009-10-08 17:02:47

回答

3

SVD是一種很好的方法(可能)。 LSA(潛在語義分析)是基於它的,基本上具有相同的維度方法。我已經在這裏詳細討論過了(最後): lsa-latent-semantic-analysis-how-to-code-it-in-php或者查看SO上的LSA標籤。

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

+0

謝謝,這是有幫助的。爲了將U變成U',我是否簡單地截斷了第二列之後的所有內容,還是比這更有趣? – PlexLuthor 2009-10-08 15:57:53

+0

我很確定它就是這麼簡單(假設matlab命令欄中的列和特徵值對應) – 2009-10-08 16:07:43

+0

好的。我只是以我認爲你說的方式工作,但我仍然無法獲取新的三維數據,並且無需重新計算整個UxSxV集合即可得到二維投影。我錯過了LSA的一些東西嗎?也就是說,我有X(15x3),U,S,V,U',S',V',現在我得到A(1x3)。我應該做些什麼來獲得1x2版本的A? – PlexLuthor 2009-10-08 16:40:17

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

我不認爲有一種內置的方式來更新Matlab內現有的SVD。我google'd爲「SVD更新」,並找到了許多結果中的this paper