Вам нужно сначала вычислить ковариационную матрицу 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