Frage

Ich versuche, einen High-Dimension-Datensatz zu 2-D zu reduzieren. Aber ich habe keinen Zugriff auf den gesamten Datensatz im Voraus. Also, würde Ich mag eine Funktion erzeugen, die ein N-dimensionaler Vektor nimmt und gibt einen 2-dimensionalen Vektor, so dass, wenn ich es Vektoren geben, die nahe bei N-dimensionalen Raum sind, die Ergebnisse sind in der Nähe in 2-dimensionaler Raum.

Ich dachte, SVD war die Antwort, die ich brauchte, aber ich kann es nicht funktioniert.

Der Einfachheit halber sei N = 3 und ich nehme an 15 Datenpunkte haben. Wenn ich alle Daten im Voraus in eine 15x3 Matrix X, dann:

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

das tut, was ich will. Aber ich nehme an einen neuen Datenpunkt erhalten, A, einen 1x3-Vektor. Gibt es eine Möglichkeit zu verwenden, U, S oder V A in den entsprechenden 1x2-Vektor zu drehen?

Wenn SVD eine verlorene Sache ist, kann mir jemand sagen, was ich sollte stattdessen tun?

Hinweis: Dies ist Matlab-Code, aber ist mir egal, wenn die Antwort C, Java, oder einfach nur Mathematik. Wenn Sie nicht Matlab lesen können, fragen, und ich werde klären.

War es hilfreich?

Lösung

SVD ist ein feiner Ansatz (wahrscheinlich). LSA (Latent Semantic Analysis) basierte drum herum, und hat im Grunde den gleichen Dimensionalität Ansatz. Ich habe darüber gesprochen (endlich) an: lsa latente semantische Analyse-how-to- Code-it-in-php oder den LSA-Tag hier auf SO überprüfen.

Ich weiß, es ist eine unvollständige Antwort. Holler, wenn Sie weitere Hilfe benötigen!

Andere Tipps

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

Ich glaube nicht, gibt es ein eingebaute Möglichkeit, einen bestehenden SVD in Matlab zu aktualisieren. Ich google'd für "SVD-Update" und gefunden dieses Papier unter die viele Ergebnisse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top