Pergunta

Estou tentando reduzir um conjunto de dados de alta dimensão para o 2-D. No entanto, não tenho acesso a todo o conjunto de dados antecipadamente. Então, eu gostaria de gerar uma função que pega um vetor n-dimensional e retorna um vetor bidimensional, de modo que, se eu o der aos vetores que estão próximos no espaço n-dimensional, os resultados estão próximos em bidimensional espaço.

Eu pensei que o SVD era a resposta que eu precisava, mas não posso fazer funcionar.

Para simplificar, deixe n = 3 e suponha que eu tenha 15 pontos de dados. Se eu tiver todos os dados antecipadamente em uma matriz de 15x3 X, então:

[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,:);

faz o que eu quero. Mas suponha que eu receba um novo DataPoint, A, um vetor 1x3. Existe uma maneira de usar u, s ou v para transformar um no vetor 1x2 apropriado?

Se o SVD é uma causa perdida, alguém pode me dizer o que eu deveria estar fazendo?

Nota: Este é o código MATLAB, mas não me importo se a resposta é C, Java ou apenas matemática. Se você não consegue ler o Matlab, pergunte e eu esclarecerei.

Foi útil?

Solução

SVD é uma abordagem fina (provavelmente). A LSA (análise semântica latente) é baseada em torno dela e possui basicamente a mesma abordagem de dimensionalidade. Eu falei sobre isso (finalmente) em:LSA-Latent-semântica-análise-como-código-It-It-Php Ou confira a tag LSA aqui em SO.

Sei que é uma resposta incompleta. Chiller se você quiser mais ajuda!

Outras dicas

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

Eu não acho que exista uma maneira interna de atualizar um SVD existente no MATLAB. Eu no Google, para "Atualização SVD" e encontrei este papel entre os muitos resultados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top