2009-10-08 3 views
4

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

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

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

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

делает то, что я хочу. Но предположим, что я получаю новый datapoint, A, вектор 1x3. Есть ли способ использовать U, S или V, чтобы превратить A в соответствующий вектор 1x2?

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

Примечание: Это код Matlab, но мне все равно, является ли ответ C, Java или просто математикой. Если вы не можете прочитать Matlab, спросите, и я уточню.

+2

Ugh, s vs. S действительно обманывает глаз. ;) –

ответ

3

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

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

+0

Спасибо, это было полезно. Чтобы превратить U в U ', я просто усекаю все после второго столбца или это более привлекательно? – PlexLuthor

+0

Я уверен, что это просто так (при условии, что Matlab заказывает столбцы, соответствующие совпадениям столбцов и собственных номеров) –

+0

Хорошо. Я просто играл с ним так, как я думал, вы сказали, что это сработает, но я все еще не могу взять новые 3-D данные и получить 2-мерную проекцию без пересчета всего набора UxSxV. Я что-то пропустил в LSA? То есть, у меня есть X (15x3), U, S, V, U ', S', V ', и теперь я получаю A (1x3). Что мне делать, чтобы получить версию 1x2 A? – 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

Я не думаю, что есть встроенный способ обновления существующего SVD внутри Matlab. Я google'd для «обновления SVD» и нашел this paper среди множества результатов.

Смежные вопросы