Поиск главных компонентов с максимальной дисперсией в Matlab

Я использовал следующий код для вычисления PCA:

    function [signals,PC,V] = pca2(data) 
    [M,N] = size(data); 
    % subtract off the mean for each dimension 
    mn = mean(data,2); 
    data = data - repmat(mn,1,N); 
    % construct the matrix Y 
    Y = data’ / sqrt(N-1); 
    % SVD does it all 
    [u,S,PC] = svd(Y); 
    % calculate the variances 
    S = diag(S); 
    V = S .* S; 
    % project the original data 
    signals = PC’ * data;

Я хочу сохранить основные компоненты с максимальной дисперсией, скажем, первые 10 основных компонентов, которые способствуют максимальной дисперсии. Как мне это сделать?


person Sid    schedule 07.01.2014    source источник


Ответы (2)


Я думаю, svds может сделать эту работу за вас.

В доке написано:

s = svds(A,k) вычисляет k наибольших сингулярных значений и связанных с ними сингулярных векторов матрицы A.

Что по существу является k наибольшими собственными значениями и собственными векторами. Они отсортированы по собственным значениям в порядке убывания.

Итак, для 10 основных компонентов просто используйте [eigvec eigval] = svds(Y, 10);

person Ray    schedule 07.01.2014
comment
Спасибо, Рэй, я попробую это. - person Sid; 07.01.2014

person    schedule
comment
Леннон, я пробовал это, но строка Y = data'*data / (N-1); дал ошибку. Я проверю это еще раз и вернусь к вам с точной ошибкой. - person Sid; 07.01.2014
comment
Сид, твои данные должны быть вектором. Если это не так, используйте data=reshape(data,M*N,1); см. мое обновление в ответ, спасибо - person lennon310; 07.01.2014
comment
Леннон, это сработало. Чтобы вычесть среднее значение, я использовал: mn = mean(data,2); данные = данные - repmat(mn,1,N); - person Sid; 07.01.2014
comment
Однако у меня есть еще одно сомнение: из этой функции я получаю два выхода: «сигналы» и «V». размер (сигналы) = 65536 * 10 и размер (V) = 21 * 10. Не могли бы вы объяснить мне, что именно означают выходные данные? Я знаю, что «V» — это собственное пространство/новые координаты, а «сигналы» — это проекции данных в собственное пространство/новые координаты. Это правильно? - person Sid; 07.01.2014
comment
И для обучения я использую сигналы (имеющие размер 65536 * 10), а не V для обучения классификатора. Это нормально? - person Sid; 07.01.2014
comment
Сид. Вы правильно понимаете. V — это собственные векторы, соответствующие первым 10 собственным значениям, а сигналы — это проекция данных на V. Когда вы тренируетесь, вы используете сигналы вместо V. Спасибо. - person lennon310; 07.01.2014
comment
Большое спасибо, что действительно все очень ясно. - person Sid; 08.01.2014
comment
: Если бы вы могли помочь мне со следующим вопросом, я был бы очень благодарен. Спасибо. stackoverflow.com/questions/20998789/ - person Sid; 08.01.2014
comment
Я использовал «сигналы» для обучения классификатора svm, но он показывает прогнозируемую метку как -1, хотя она должна быть +1. Я использую pca, чтобы найти особенности данных обучения и тестирования. Любая помощь будет действительно полезной. - person Sid; 27.01.2014
comment
мне просто интересно, что вы делали в эти дни, переключая прием на различные вопросы? - person lennon310; 31.01.2014
comment
извините, я только что понял, что могу принять не более одного ответа: /! - person Sid; 02.02.2014
comment
было бы очень полезно, если бы вы ответили на это: stackoverflow.com/questions/21474331/ - person Sid; 06.02.2014