Решение системы нормальных уравнений в C++
Я хотел бы решить систему линейных уравнений:
Ax = b
А это 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 и т. Д., Но я не знаю, как быстро вычисляются ЦП с использованием этих пакетов. Я также не знаю, если это численно быстро, почему решить "х"
Что для меня важно, так это то, что время вычислений ЦП будет коротким, насколько это возможно, и хорошая документация, так как я новичок.
После решения нормального уравнения Ax = b
Я хотел бы улучшить свою аппроксимацию, используя регрессивный и, возможно, позже применяя фильтр Калмана.
У меня вопрос, какая библиотека C++ является робустером и быстрее для нужд, которые я описал выше?
5 ответов
Это решение методом наименьших квадратов, потому что у вас больше неизвестных, чем уравнений. Если m действительно равно 2, это говорит мне о том, что вам будет достаточно простого линейного наименьших квадратов. Формулы могут быть записаны в закрытом виде. Вам не нужна библиотека.
Если m состоит из одной цифры, я бы сказал, что вы можете легко решить эту проблему, используя A(транспонирование)*A*X = A(транспонирование)*b. Простое разложение LU для решения коэффициентов было бы достаточно. Это должно быть гораздо более простой проблемой, чем вы ее представляете.
uBlas не оптимизирован, если вы не используете его с оптимизированными привязками BLAS.
Следующие оптимизированы для многопоточности и SIMD:
- Intel MKL. Библиотека FORTRAN с интерфейсом C. Не бесплатно, но очень хорошо.
- Эйген. Истинная библиотека C++. Бесплатный и открытый исходный код. Прост в использовании и хорошо.
- Атлас. Фортран и С. Бесплатный и открытый исходный код. Не подходит для Windows, но в остальном хорошо.
Кстати, я не знаю точно, что вы делаете, но, как правило, нормальные уравнения не являются подходящим способом для линейной регрессии. Если ваша матрица не хорошо подготовлена, предпочтение следует отдавать QR или SVD.
Если liscencing не проблема, вы можете попробовать научную библиотеку GNU
http://www.gnu.org/software/gsl/
Он поставляется с библиотекой blas, которую можно заменить на оптимизированную библиотеку, если потребуется позже (например, библиотеку intel, ATLAS или ACML (AMD chip).
Если у вас есть доступ к MATLAB, я бы порекомендовал использовать его библиотеки C.
Если вам действительно нужно специализироваться, вы можете аппроксимировать инверсию матрицы (с произвольной точностью), используя метод Skilling. Он использует только операции порядка (N^2) (а не порядок N^3 обычной матричной инверсии - разложение LU и т. Д.).
Это описано в тезисе Гиббса, с которым связано здесь (около страницы 27):