Во-первых, полезна документация по функции 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;