Хобрук: Ваш путь к мастерству в программировании

Eigen: Можно ли создать кондиционер, подобный LeastSquareDiagonalPreconditioner, если я могу вычислить только Aty и Ax?

Я хочу решить метод наименьших квадратов, как система A^t * A * x = -A^t * x. (Я применяю метод Гаусса-Ньютона для специальной задачи).

Я написал специальные процедуры, которые позволяют мне вычислять произведения A * x и A^t * y. С такими подпрограммами легко использовать безматричные решатели благодаря Eigen.

Но мой подход сходится не так хорошо, как Eigen::LeastSquaresConjugateGradient. Я сделал небольшой тест, и похоже, что LeastSquareDiagonalPreconditioner значительно ускоряет сходимость.

Мой вопрос: как я могу использовать LeastSquareDiagonalPreconditioner или реализовать собственный предварительный кондиционер, если я могу вычислять только матричные произведения? Кстати, я не очень хорошо разбираюсь в материалах предварительного кондиционирования/сопряженного градиента.

ИЗМЕНИТЬ

Для ясности: я хочу использовать безматричные решатели от Eigen со своими подпрограммами продукта.

ИЗМЕНИТЬ 2

Матрично-векторные произведения были получены с использованием прямого и обратного автодиффа для некоторых целевых функций.


  • В моем понимании предобуславливатель просто состоит в замене уравнения Ax=b на AtAx=Atb, чтобы получить уравнение с симметричной положительно определенной матрицей. Это позволяет использовать итерационные методы. У вас уже есть такая симметричная матрица. Трудно ответить вам без более подробной информации о вашей реализации метода Гаусса-Ньютона. 08.11.2018
  • Я не понимаю, хотите ли вы использовать Eigen, или только подмножество функций Eigen, или вообще не использовать функцию Eigen. 08.11.2018
  • @Damien спасибо за комментарий! Я отредактировал сообщение - я хочу использовать решатели Eigen со своими процедурами продукта 08.11.2018
  • @Damien, насколько мне известно, прекондиционер масштабирует матрицу A (или AtA) и улучшает условное число матрицы. 08.11.2018
  • Вы протестировали Eigen::LeastSquaresConjugateGradient, который работает хорошо. Так почему бы не использовать его? 08.11.2018
  • @Damien В настоящее время я использую его. Но получение матрицы для моей задачи (якобиан для гаусс-ньютона) очень медленное. С другой стороны, получение продукта якобианского вектора происходит довольно быстро. Поэтому я хочу использовать это. 08.11.2018
  • Давайте продолжим обсуждение в чате. 08.11.2018
  • Является ли актуальным вопрос, как вычислить диагональ A^t*A или, если она у вас есть, как использовать этот предварительный кондиционер? На вторую проблему отвечает @ggael, для первой проблемы вам нужно больше описать A (и, возможно, это будет больше математический вопрос, чем вопрос по программированию). 08.11.2018
  • @chtz ты прав. Должен ли я создать сообщение на math.stackexchange? Правильно ли я понимаю, что это невозможно сделать, используя только продукты A-vec? За исключением выполнения N продуктов по [1, 0, 0 ....] как векторы? Я получил продукты, используя автодифференциал в прямом и обратном режимах для моей целевой функции. 09.11.2018
  • Я не вижу никакого очевидного решения, кроме вычисления квадрата нормы каждого A*Unit(i) — может быть, вы можете ускорить их вычисление, поскольку вы знаете, что каждый раз только один элемент отличен от нуля. 09.11.2018

Ответы:


1

Проще всего было бы реализовать свой собственный класс прекондиционера, наследующий DiagonalPreconditioner и реализующий что-то вроде LeastSquareDiagonalPreconditioner ::factorize(), но адаптированное к вашему типу. В основном вам нужно вычислить:

 m_invdiag(j) = 1./mat.col(j).squaredNorm();

для всех столбцов j, используя стратегию, которую вы уже внедрили для операторов продукта.

08.11.2018
Новые материалы

Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

Фишинг — Упаковано и зашифровано
Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..