2015-05-20 4 views
2

Я хочу уменьшить размер данных до размеров ndim в MATLAB. Я использую pcares для уменьшения размера, но результат (т. Е. Остатки, реконструированные) имеет те же размеры, что и данные, а не ndim. Как я могу проецировать остатки только на размеры ndim.Уменьшение размерности в Matlab

[residuals,reconstructed] = pcares(X,ndim) 

Пример кода

MU = [0 0]; 
SIGMA = [4/3 2/3; 2/3 4/3]; 
X = mvnrnd(MU,SIGMA,1000); 
[residuals,reconstructed] = pcares(X,1) 

Теперь я ожидаю, что остатки иметь 1 размеры, т.е. данные X Прогнозируется прайм компонент, как я определил его как pcares(X,1). Но здесь как остатки и реконструированы имеют одинаковый из 2.

+0

Можете ли вы опубликовать минимальный рабочий пример, чтобы мы могли построить проблему на нашем конце? Вызов 'pcares' с' ndim' ** должен ** дать вам проектные векторы ndim для восстановления ваших данных. Получение такого же размера измерений, как и исходные данные, кажется довольно странным. – rayryeng

+0

@rayryeng пожалуйста, проверьте образец кода. Я хочу, чтобы данные проецировались в один размер вдоль основного компонента. – KarateKid

ответ

2

pcares делает свою работу. Если вы читали documentation, вы вызываете функцию следующим образом:

[RESIDUALS,RECONSTRUCTED] = pcares(X,NDIM); 

RESIDUALS возвращает невязки для каждой точки данных, сохраняя первые NDIM размеры ваших данных и RECONSTRUCTED это реконструированные данные, используя первые NDIM основные компоненты.

Если вы хотите, чтобы действительно векторов проекции, вам нужно использовать pca. Вы назвали бы это так:

[coeff,score] = pca(x); 

На самом деле, это то, что делает pcares под капотом, но это также реконструирует данные для вас с использованием вышеуказанных выходов. coeff возвращает основные коэффициенты для ваших данных, в то время как score возвращает сами фактические проекционные векторы. score таков, что каждый столбец представляет собой один вектор проекции. Следует отметить, что они упорядочены в отношении доминирования, как вы ожидали бы с помощью PCA ... и поэтому первая колонка является наиболее доминирующим направлением, вторым доминирующим направлением второго столбца и т. Д.

Как только вы позвоните выше , вы просто указываете на coeff и score, чтобы сохранить любые компоненты, которые вы хотите. В вашем случае, вы просто хотите, первый компонент, и поэтому сделать это:

c = coeff(1); 
s = score(:,1); 

Если вы хотите восстановить данные, приведенные ваши проекции векторов, ссылаясь на вторую последнюю строку коды, это просто:

[coeff,score] = pca(x); 
n = size(X,1); 
ndim = 1; %// For your case 
reconstructed = repmat(mean(X,1),n,1) + score(:,1:ndim)*coeff(:,1:ndim)'; 

Вышеуказанное в основном то, что pcares делает под капотом.

+0

6 месяцев спустя? Лучше поздно, чем никогда. лол. Удачи. – rayryeng

-3

Попробуйте использовать команду squeeze - см здесь: http://uk.mathworks.com/help/matlab/ref/squeeze.html

+2

100% неправильный. Этот вопрос требует уменьшения размерности данных. 'squeeze' исключает одномерные измерения из данных. Не то же самое. – rayryeng

+0

Достаточно честный.Но вы можете быть только на 100% неправильно, если вопрос был сформулирован однозначно в первую очередь ... – JamesP

+0

Вопрос был сформулирован однозначно. Я извиняюсь за суровое звучание, но этот ответ потенциально опасен и вводит в заблуждение. 'squeeze' никоим образом не снижает размерность данных. Он уменьшает размер одноэлементности. Мой комментарий выше не означает, что вы говорите, что ошибаетесь, но предупреждаете тех, кто пытается использовать «сжатие» в этом контексте. – rayryeng

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