Анализ основных компонентов в Matlab? - PullRequest
1 голос
/ 11 мая 2019

У меня есть тренировочный набор размером (size(X_Training)=122 x 125937).

  • 122 количество функций
  • и 125937 - размер выборки.

Из моего небольшого понимания PCA полезен, когда вы хотите уменьшить размерность функций. Это означает, что я должен уменьшить 122 до меньшего числа.

Но когда я использую в Matlab:

X_new = pca(X_Training)

Я получаю матрицу размера 125973x121, я действительно запутался, потому что это меняет не только функции, но и размер выборки? Для меня это большая проблема, потому что у меня все еще есть целевой вектор Y_Training, который я хочу использовать для своей нейронной сети.

Любая помощь? Я плохо интерпретировал результаты? Я только хочу уменьшить количество функций.

1 Ответ

3 голосов
/ 11 мая 2019

Во-первых, полезна документация по функции PCA: https://www.mathworks.com/help/stats/pca.html. В ней упоминается, что строки являются выборками , а столбцы - функциями . Это означает, что вам нужно сначала транспонировать матрицу.

Во-вторых, вам нужно указать количество измерений, которое нужно уменьшить до a priori . Функция PCA не делает это автоматически. Следовательно, помимо извлечения основных коэффициентов для каждого компонента, вам также необходимо извлечь баллы. Получив это, вы просто поднакладываете в партитуры и выполняете перепроецирование в уменьшенное пространство.

Другими словами:

n_components = 10; % Change to however you see fit.
[coeff, score] = pca(X_training.');
X_reduce = score(:, 1:n_components);

X_reduce будет набором объектов с уменьшенной размерностью, а общее количество столбцов будет общим количеством сокращенных объектов. Также обратите внимание, что количество обучающих примеров не меняется, как мы ожидаем. Если вы хотите убедиться в том, что число элементов находится вдоль строк, а не столбцов после того, как мы сократили количество объектов, транспонируйте и эту выходную матрицу, прежде чем продолжить.

Наконец, если вы хотите автоматически определить количество объектов, до которых нужно сократить, один из способов сделать это - вычислить дисперсию, объясненную для каждого объекта, а затем накопить значения от первого объекта до точки, где мы превышаем некоторое порог. Обычно используется 95%.

Следовательно, вам нужно предоставить дополнительные выходные переменные для захвата этих:

[coeff, score, latent, tsquared, explained, mu] = pca(X_training.');

Я позволю вам просмотреть документацию, чтобы понять другие переменные, но одна из них, которую вы просматриваете, - это explained переменная. Что вы должны сделать, это найти точку, где общая объясненная дисперсия превышает 95%:

[~,n_components] = max(cumsum(explained) >= 95);

Наконец, если вы хотите выполнить реконструкцию и посмотреть, насколько хорошо восстановление из исходного пространственного объекта выполняется из уменьшенного объекта, вам необходимо выполнить перепроецирование в исходное пространство:

X_reconstruct = bsxfun(@plus, score(:, 1:n_components) * coeff(:, 1:n_components).', mu);

mu - средство каждого объекта в виде вектора строки. Поэтому вам нужно добавить этот вектор во все примеры, поэтому требуется широковещательная рассылка, и поэтому используется bsxfun. Если вы используете MATLAB R2018b, это теперь неявно делается при использовании операции сложения.

X_reconstruct = score(:, 1:n_components) * coeff(:, 1:n_components).' + mu;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...