Вы должны сначала вычислить корреляционную матрицу С из вашей матрицы данных 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);