Перш за все, вам слід вказати, чи хочете ви всі компоненти чи найбільш значущі?
Позначимо матрицю причому - кількість зразків і розмірність. N MA∈RN×MNM
Якщо ви хочете, щоб усі компоненти були класичним шляхом, це обчислити коваріаційну матрицю (яка має складність у часі ), а потім застосувати до неї SVD (додаткові ). З точки зору пам'яті це займе (ковариационная матриця + сингулярні вектори і значення формує прямокутний базис) або Гб в подвійній точності для конкретного . O ( N M 2 ) O ( M 3 ) O ( 2 M 2 ) ≈ 1,5 AC∈RM×MO(NM2)O(M3)O(2M2)≈1.5A
Ви можете застосувати SVD безпосередньо до матриці якщо нормалізувати кожен вимір до цього і взяти ліві особливі вектори. Однак практично я б очікував, що SVD матриці триватиме довше.AAA
Якщо вам потрібна лише частина (можливо, найбільш значущих) компонентів, ви можете застосувати ітераційний PCA . Наскільки мені відомо, всі ці алгоритми тісно пов'язані з процесом Ланцоса, таким чином, ви залежите від спектру і практично буде важко досягти точності SVD для отриманих векторів, і він погіршиться з кількістю сингулярного вектора.C