Уменьшение размера - PullRequest
       11

Уменьшение размера

4 голосов
/ 08 октября 2009

Я пытаюсь уменьшить набор данных высокой размерности до 2-D. Однако у меня нет доступа ко всему набору данных заранее. Итак, я хотел бы сгенерировать функцию, которая принимает N-мерный вектор и возвращает 2-мерный вектор, так что если я передам его векторам, близким в N-мерном пространстве, результаты будут близки в 2-мерном пространство.

Я думал, что SVD - это тот ответ, который мне нужен, но я не могу заставить его работать.

Для простоты, давайте N = 3 и предположим, что у меня есть 15 точек данных. Если у меня есть все данные заранее в матрице X 15x3, то:

[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, спроси, и я уточню.

Ответы [ 3 ]

3 голосов
/ 08 октября 2009

SVD - это хороший подход (вероятно). LSA (скрытый семантический анализ) основан на этом и имеет в основном тот же подход размерности. Я говорил об этом (подробно) по адресу: lsa-latent-semantic-analysis-how-to-code-in-php или проверьте тег LSA здесь на SO.

Я понимаю, что это неполный ответ. Холли, если тебе нужна дополнительная помощь!

2 голосов
/ 09 октября 2009
% 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 голосов
/ 09 октября 2009

Я не думаю, что есть встроенный способ обновить существующий SVD в Matlab. Я google'd для "обновления SVD" и нашел этот документ среди многих результатов.

...