Подтвердить что ты не робот

Сколько основных компонентов взять?

Я знаю, что анализ главных компонент делает SVD на матрице, а затем генерирует собственную матрицу значений. Чтобы выбрать основные компоненты, мы должны взять только первые несколько собственных значений. Теперь, как мы определяем количество собственных значений, которые мы должны взять из матрицы собственных значений?

4b9b3361

Ответ 1

Чтобы решить, сколько собственных значений/собственных векторов сохранить, вы должны рассмотреть свою причину для выполнения PCA в первую очередь. Делаете ли вы это для сокращения требований к хранилищу, чтобы уменьшить размерность для алгоритма классификации или по какой-то другой причине? Если у вас нет каких-либо строгих ограничений, я рекомендую составить совокупную сумму собственных значений (если они находятся в порядке убывания). Если вы разделите каждое значение на общую сумму собственных значений до построения графика, тогда ваш график покажет долю полной дисперсии, сохраненную по сравнению с количеством собственных значений. Затем график даст хорошее представление о том, когда вы достигнете точки уменьшения отдачи (т.е. Небольшое отклонение достигается за счет сохранения дополнительных собственных значений).

Ответ 2

Нет правильного ответа, он находится где-то между 1 и n.

Подумайте о главном компоненте, как о улице в городе, в котором вы никогда не бывали раньше. Сколько улиц вы должны взять, чтобы узнать город?

Ну, вы должны обязательно посетить главную улицу (первый компонент) и, возможно, некоторые другие большие улицы. Вам нужно посетить каждую улицу, чтобы хорошо знать город? Наверное, нет.

Чтобы прекрасно знать город, вы должны посетить все улицы. Но что, если вы могли бы посетить, скажем, 10 из 50 улиц и иметь 95% -ное понимание города? Это достаточно хорошо?

В принципе, вы должны выбрать достаточно компонентов, чтобы достаточно объяснить дисперсию, с которой вам удобно.

Ответ 3

Как говорили другие, это не мешает описать объясненную дисперсию.

Если вы используете PCA в качестве этапа предварительной обработки для контролируемой учебной задачи, вам следует перекрестно проверить весь конвейер обработки данных и обработать количество измерений PCA в качестве гиперпараметра, чтобы выбрать, используя поиск сетки по окончательной контролируемой оценке (например, F1 оценка для классификации или RMSE для регрессии).

Если кросс-валидированный поиск сетки во всем наборе данных является слишком дорогостоящим, попробуйте на двух подпробах, например. один с 1% данных, второй - с 10%, и посмотрите, получилось ли у вас одинаковое оптимальное значение для размеров PCA.

Ответ 4

Для этого существует несколько эвристик.

например. взяв первые k собственных векторов, которые фиксируют не менее 85% от общей дисперсии.

Однако для высокой размерности эти эвристики обычно не очень хороши.

Ответ 5

Я настоятельно рекомендую следующую работу Гавиша и Донохо: Оптимальный жесткий порог для сингулярных значений - 4/sqrt (3).

Я опубликовал более подробное изложение этого вопроса на CrossValidated (stats.stackexchange.com). Вкратце, они получают оптимальную процедуру в пределе очень больших матриц. Процедура очень проста, не требует каких-либо настроек, настроенных вручную, и на практике она работает очень хорошо.

У них есть приятное дополнение кода: https://purl.stanford.edu/vg705qn9070

Ответ 6

В зависимости от вашей ситуации может быть интересно определить максимально допустимую относительную ошибку, проецируя ваши данные в измерениях ndim.

Я проиллюстрирую это небольшим примером Matlab. Просто пропустите код, если вас это не интересует.

Сначала я создам случайную матрицу из n образцов (строк) и p функций, содержащих ровно 100 ненулевых главных компонентов.

n = 200;
p = 119;
data = zeros(n, p);
for i = 1:100
  data = data + rand(n, 1)*rand(1, p);
end

Изображение будет выглядеть так:

введите описание изображения здесь

Для этого образца изображения можно рассчитать относительную ошибку, сделав проецирование ваших входных данных на размеры ndim следующим образом:

[coeff,score] = pca(data,'Economy',true);

relativeError = zeros(p, 1);
for ndim=1:p
    reconstructed = repmat(mean(data,1),n,1) + score(:,1:ndim)*coeff(:,1:ndim)';
    residuals = data - reconstructed;
    relativeError(ndim) = max(max(residuals./data));
end

Построение относительной ошибки в зависимости от количества измерений (главных компонентов) приводит к следующему графику:

введите описание изображения здесь

На основе этого графика вы можете решить, сколько основных компонентов вам нужно учитывать. В этом теоретическом изображении, принимающем 100 компонентов, получается точное представление изображения. Таким образом, использование более 100 элементов бесполезно. Если вы хотите, например, максимальную ошибку 5%, вы должны взять около 40 основных компонентов.

Отказ от ответственности. Полученные значения действительны только для моих искусственных данных. Поэтому не используйте ожидаемые значения в вашей ситуации вслепую, но выполняйте тот же анализ и сделайте компромисс между сделанной ошибкой и количеством необходимых вам компонентов.

Ссылка на код