Решение системы нормальных уравнений в C ++ - PullRequest
7 голосов
/ 03 января 2011

Я хотел бы решить систему линейных уравнений:

 Ax = b

A - это матрица n x m (не квадратная), b и x оба являются n x 1 векторами.Когда A и b известны, n составляет порядка 50-100, а m составляет около 2 (другими словами, A может быть максимальным [100x2]).

Я знаю решение x:$x = \inv(A^T A) A^T b$

Я нашел несколько способов решить эту проблему: uBLAS (Boost), Lapack, Eigen и т. Д., Но я не знаю, как быстро вычисляются ЦП с использованием этих пакетов.Я также не знаю, если это численно быстро, почему решить 'x'

Что мне важно, так это то, что время вычислений ЦП будет коротким, насколько это возможно, и хорошая документация, так как я новичок.

После решения нормального уравнения Ax = b я хотел бы улучшить свое приближение, используя регрессив, а возможно позже , применяя фильтр Калмана.

У меня вопрос, какая библиотека C ++ является робустером и быстреедля нужд, которые я описал выше?

Ответы [ 5 ]

7 голосов
/ 03 января 2011

Это решение методом наименьших квадратов, потому что у вас больше неизвестных, чем уравнений.Если m действительно равно 2, это говорит мне, что вам будет достаточно простого линейного наименьших квадратов.Формулы могут быть записаны в закрытом виде.Вам не нужна библиотека.

Если m состоит из одной цифры, я все равно скажу, что вы можете легко решить это, используя A (транспонирование) * A * X = A (транспонирование) * b.Простое разложение LU для решения коэффициентов было бы достаточно.Это должно быть гораздо более простой проблемой, чем вы думаете.

7 голосов
/ 03 января 2011

uBlas не оптимизирован, если вы не используете его с оптимизированными привязками BLAS.

Для многопоточности и SIMD оптимизировано следующее:

  1. Intel MKL. Библиотека FORTRAN с интерфейсом C.Не бесплатно, но очень хорошо.
  2. Eigen. Библиотека True C ++.Бесплатный и открытый исходный код.Прост в использовании и хорошо.
  3. Атлас. Фортран и С. Бесплатный и открытый исходный код.Не подходит для Windows, но в остальном хорошо.

Кстати, я точно не знаю, что вы делаете, но, как правило, нормальные уравнения не являются подходящим способом для линейной регрессии.Если ваша матрица не хорошо подготовлена, предпочтительнее использовать QR или SVD.

2 голосов
/ 03 января 2011

Если liscencing не является проблемой, вы можете попробовать научную библиотеку gnu

http://www.gnu.org/software/gsl/

Она поставляется с библиотекой blas, которую можно заменить на оптимизированную библиотеку, если вам нужнопозже (например, библиотека intel, ATLAS или ACML (чип AMD).

1 голос
/ 03 января 2011

Если у вас есть доступ к MATLAB, я бы порекомендовал использовать его библиотеки C.

0 голосов
/ 03 января 2011

Если вам действительно нужно специализироваться, вы можете аппроксимировать инверсию матрицы (с произвольной точностью), используя метод Skilling. Он использует только операции порядка (N ^ 2) (а не порядок N ^ 3 обычной матричной инверсии - разложение LU и т. Д.).

Это описано в тезисе Гиббса, с которым здесь связано (около страницы 27):

http://www.inference.phy.cam.ac.uk/mng10/GP/thesis.ps.gz

...