Lapackpp vs Boost BLAS
Для начала я новичок в C++.
Я пишу программу для моей магистерской диссертации, часть которой предполагает регрессивное решение регрессии.
Я хотел бы решить:
Ax = y
В моем случае скорость вычислений не является пренебрежимой, поэтому я хотел бы узнать, использует ли Boost::BLAS
x = (A^T A)^{-1}A^Ty
потребует меньше вычислений, чем Lapackpp (я использую gentoo).
PS Мне удалось найти на сайте проекта Lapackpp документацию по классу, но не примеры. Может ли кто-нибудь дать мне несколько примеров, если Lapack быстрее, чем Boost::BLAS?
Спасибо
4 ответа
С точки зрения численного анализа, вы никогда не хотите писать код, который
- Явно инвертирует матрицу или
- Формирует матрицу нормальных уравнений (
A^T A
) для регрессии
Оба они более трудоемки и менее точны (и, вероятно, менее стабильны), чем альтернативы, которые решают ту же проблему напрямую.
Всякий раз, когда вы видите какую-то математику, показывающую инверсию матрицы, это следует понимать как "решить систему линейных уравнений", или разложить матрицу и использовать факторизацию для решения системы. И BLAS, и Lapack имеют процедуры для этого.
Аналогично, для регрессии вызовите библиотечную функцию, которая вычисляет регрессию, или прочитайте, как это сделать самостоятельно. Метод нормальных уравнений является учебником неправильным способом сделать это.
Вам действительно нужно реализовать с C++? Например, будет ли Python / Numpy альтернативой для вас? А для рекурсивной регрессии (наименьших квадратов) я рекомендую поискать лекции профессора Странга из Массачусетского технологического института по линейной алгебре и / или его книги.
Интерфейс высокого уровня и оптимизация низкого уровня - это две разные вещи.
LAPACK и uBLAS обеспечивают интерфейс высокого уровня и неоптимизированную реализацию низкого уровня. Аппаратно оптимизированные низкоуровневые подпрограммы (или привязки) должны поступать откуда-то еще. После того как привязки предоставлены, LAPACK и uBLAS могут использовать оптимизированные подпрограммы низкого уровня вместо своих собственных неоптимизированных реализаций.
Например, ATLAS предоставляет оптимизированные низкоуровневые подпрограммы, но только ограниченный высокоуровневый интерфейс (уровень 3 BLAS и т. Д.). Вы можете привязать ATLAS к LAPACK. Тогда LAPACK использовал бы ATLAS для работы низкого уровня. Думайте о LAPACK как о старшем менеджере, который делегирует техническую работу опытным инженерам (ATLAS). То же самое для UBLAS. Вы можете связать UBLAS и MKL. Результатом будет оптимизированная библиотека C++. Проверьте документацию и используйте Google, чтобы выяснить, как это сделать.
Armadillo оборачивает BLAS и LAPACK в приятный интерфейс C++ и предоставляет следующие Matlab-подобные функции, непосредственно связанные с вашей проблемой: