2013-04-18 2 views
2

У меня есть матрица M измерения m * n. M содержит n количество данных, каждое из которых имеет m размерность, а m очень велико, чем n.PCA с использованием SVD в OpenCV

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

ответ

4

Вы должны сначала вычислить корреляционную матрицу С из вашей матрицы данных M. Вы можете использовать calcCovarMatrix функции OpenCV или просто вычислить C = (M - мю)»х (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);

2

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

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

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

Для PCA с помощью OpenCV, Google дает some very usefule examples