PCA с использованием SVD в OpenCV

У меня есть матрица M размера m*n. M содержит n данных, каждый из которых имеет размерность m, и m очень-очень больше, чем n.

Теперь мой вопрос: как вычислить или каковы шаги или процедура для поиска PCA для M с использованием SVD в OpenCV сохраняя только те собственные векторы, содержащие 99% от общей нагрузки или энергии?


person Saikat    schedule 18.04.2013    source источник


Ответы (2)


Вам нужно сначала вычислить ковариационную матрицу C из вашей матрицы данных M. Вы можете использовать OpenCV calcCovarMatrix или просто вычислить C = (M - mu)' x (M - mu), где я предположил, что ваши выборки данных хранятся в виде строк в M, а mu - это среднее значение ваших выборок данных, а A' - транспонированная матрица A.

Затем выполните SVD на C, чтобы получить USU' = SVD(C), где U' — транспонированное U. В этом случае V 'из SVD совпадает с U ', потому что C симметричен и положительно определен (если C имеет полный ранг) или полуопределен, если он имеет недостаточный ранг. U содержит собственные векторы C.

Что вы хотите сделать, так это сохранить k собственных векторов, то есть k количество столбцов (или строк? Вы должны проверить документы OpenCV, возвращает ли он собственные векторы в виде строк или столбцов) U, чьи соответствующие сингулярные значения в матрице S соответствуют k самых больших сингулярных значений И их сумма, деленная на сумму всех сингулярных значений, составляет >= 0,99. В основном сингулярные значения здесь соответствуют дисперсии для каждой соответствующей функции в ваших векторах функций, и вы сохраняете верхнее значение k, которое сохраняет 0,99, т.е. 99% дисперсии/энергии.

Эти собственные векторы, упакованные вместе в матрицу, скажем, Uk, являются вашими основаниями PCA. Поскольку эти собственные векторы также оказываются ортогональными друг другу, транспонирование Uk, Uk', является матрицей проекции. Чтобы получить точку уменьшенной размерности нового тестового образца x, просто вычислите x_reduced = Uk'*(x - mu);

person lightalchemist    schedule 18.04.2013

Как правило, для PCA (т.е. не специфичного для OpenCV) вы должны начать с ковариационной матрицы. Таким образом, в вашем случае входными данными будет квадратная матрица m*m, образованная компонентными отклонениями ваших исходных образцов.

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

Если масштаб ваших исходных переменных не одинаков — т. е. вы не нормализовали свои данные — вы можете использовать матрицу корреляции вместо матрицы ковариации.

Для PCA с использованием OpenCV Google дает некоторые очень полезные примеры

person Roger Rowland    schedule 18.04.2013