2009-10-08 8 views
4

고차원 데이터 세트를 2 차원으로 축소하려고합니다. 그러나 전 데이터 세트 전체에 액세스 할 수는 없습니다. 그래서, 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, 1x3 벡터를 얻는다 고 가정하십시오. U, S 또는 V를 사용하여 A를 적절한 1x2 벡터로 변환하는 방법이 있습니까?

SVD가 잃어버린 원인이라면 누군가 내가 대신해야 할 일을 말해 줄 수 있습니까?

참고 :이 코드는 Matlab 코드입니다. 그러나 대답이 C, Java 또는 수학 일지라도 상관 없습니다. Matlab을 읽을 수 없다면 물어 보면 명확 해집니다.

+2

어, S 대 S가 실제로 눈을 속입니다. ;) –

답변

3

SVD는 (아마도) 훌륭한 접근 방법입니다. LSA (Latent Semantic Analysis)는이를 기반으로하며 기본적으로 동일한 차원 접근 방식을 사용합니다. 나는 (길이로) 그것에 대해 얘기했습니다 : lsa-latent-semantic-analysis-how-to-code-it-in-php 또는 여기에 LSA 태그를 확인하십시오.

나는 이것이 불완전한 대답이라는 것을 알고 있습니다. 당신이 더 많은 도움을 원한다면 홀러!

+0

감사합니다. 도움이되었습니다. U를 U '로 바꾸려면 두 번째 열 뒤에있는 모든 것을 자르거나 아니면 그보다 더 상냥한가요? – PlexLuthor

+0

나는 그것이 매우 간단하다는 것을 확신한다. (matlab이 열과 고유 값이 일치하는 것으로 가정 할 때) –

+0

Ok. 방금 작업 한 것이라고 생각했던 방식으로 방금 놀았지만 UxSxV 세트 전체를 다시 계산하지 않고 새로운 3-d 데이터를 가져 와서 2-d 프로젝션을 얻을 수는 없습니다. LSA에서 뭔가를 놓쳤습니까? 즉, 나는 X (15x3), U, S, V, U ', S', V '를 가지며 A (1x3)를 얻습니다. A의 1x2 버전을 얻으려면 어떻게해야합니까? – PlexLuthor

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를 업데이트 할 수있는 기본 방법이 있다고 생각하지 않습니다. 나는 "SVD 업데이트"에 대해 google'd를했으며 많은 결과 중에서 this paper을 발견했습니다.