PCA: найти собственные значения ковариационной матрицы: решение полинома степени N


Если я правильно понимаю, принцип PCA очень прост:

  1. вычислить ковариационную матрицу векторов данныхC .
  2. решить det (C - e * * * I) = 0, чтобы найти матрицу * * C собственных значений e.
  3. вычислить матрицуC собственных векторов (из этих собственных значений).

Первый: верно ли это описание?

Во-вторых: любой алгоритм машинного решения полиномиального уравнения det (C - e* * * I) = 0 ? Я понимаю, что это общий математический вопрос (нахождение корней многочлена степени **n).

В-третьих: существуют ли простые реализации PCA в C / C++

Большое спасибо.

2 3

2 ответа:

    Во-первых, чтобы найти собственные значения, не нужно решать только что упомянутое уравнение. Существует такая вещь, как собственная композиция матрицы Во-вторых, ковариационная матрица является симметричной и положительной полуопределенной, поэтому собственная композиция для этой матрицы равнасингулярному разложению .
  1. для обеих упомянутых декомпозиций существует множество свободных и проприетарных реализаций (современная имплементация-это ЛАПАК ).
  2. существует множество библиотек, содержащих PCA. Если коммерческие реализации подходят, вы можете попробовать FinMath из RTMath или NMath из Centerpace (оба для .NET). в противном случае вы можете попробовать GSL или какую-либо другую библиотеку (есть несколько вопросов по StackOverflow, который содержит более полный список числовых библиотек).

Вы можете заглянуть в библиотеку GNU Science Library (gsl). Он обеспечивает функции поиска собственных значений. Будьте осторожны, нахождение собственных значений-это итеративная, числовая операция; то есть это не точно, и это дорого. Я считаю, что gsl использует то, что называется QR-алгоритмом.