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

私がしたいことをします。しかし、1x3 ベクトルである新しいデータポイント A を取得したとします。U、S、または V を使用して A を適切な 1x2 ベクトルに変換する方法はありますか?

SVDが失われた原因である場合、誰かが私が代わりに何をすべきか教えてもらえますか?

注: これは Matlab コードですが、答えが C、Java、または単なる数学であるかどうかは気にしません。Matlab が読めない場合は、質問してください。明確にします。

4

3 に答える 3

3

SVD は優れたアプローチです (おそらく)。LSA (Latent Semantic Analysis) はそれに基づいており、基本的に同じ次元アプローチを採用しています。それについては (詳細に) lsa-latent-semantic-analysis-how-to-code-it-in-php で話しているか 、SO の LSA タグをチェックしてください。

私はそれが不完全な答えであることを認識しています。さらに助けが必要な場合は大声で叫んでください!

于 2009-10-08T15:53:11.937 に答える
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])
于 2009-10-09T01:08:57.277 に答える
0

Matlab 内で既存の SVD を更新する組み込みの方法はないと思います。「SVD更新」をグーグルで検索したところ、多くの結果の中にこの論文が見つかりました。

于 2009-10-09T01:23:51.147 に答える