Решение переопределенной системы ограничений

У меня есть n числовых переменных (не знаю, пофиг), назовем их X[n]. У меня также есть отношения m >> n между ними, назовем их R[m], вида:

X[i] = alpha*X[j], alpha — ненулевое положительное действительное число, i и j различны, но пара (i, j) не обязательно уникальна (т. е. могут быть две связи между одними и теми же переменными с разным альфа-фактором)

Что я пытаюсь сделать, так это найти набор alpha параметров, которые решают переопределенную систему в некотором смысле наименьших квадратов. Идеальным решением было бы минимизировать квадрат суммы различий между каждым параметром уравнения и его выбранным значением, но меня устраивает следующее приближение:

Если я превращу m уравнений в переопределенную систему из n неизвестных, любой численный решатель на основе псевдообратных чисел даст мне очевидное решение (все нули). Итак, что я сейчас делаю, так это добавляю в смесь еще одно уравнение, x[0] = 1 (на самом деле подойдет любая константа) и решаю сгенерированную систему в смысле наименьших квадратов, используя псевдоинверсию Мура-Пенроуза. Хотя это пытается минимизировать сумму (x[0] - 1)^2 и сумму квадратов x[i] - alpha*x[j], я нахожу это хорошим и численно стабильным приближением к моей проблеме. Вот пример:

a = 1
a = 2*b
b = 3*c
a = 5*c

в Октаве:

A = [
  1  0  0;
  1 -2  0;
  0  1 -3;
  1  0 -5;
]

B = [1; 0; 0; 0]

C = pinv(A) * B or better yet:
C = pinv(A)(:,1)

Что дает значения для a, b, c: [0.99383; 0.51235; 0.19136] Что дает мне следующие (разумные) отношения:

a = 1.9398*b
b = 2.6774*c
a = 5.1935*c

Так что прямо сейчас мне нужно реализовать это на C/C++/Java, и у меня есть следующие вопросы:

Есть ли более быстрый способ решить мою проблему, или я на правильном пути с созданием переопределенной системы и вычислением псевдообратной?

Мое текущее решение требует разложения по сингулярным числам и трех матричных умножений, что немного много, учитывая, что m может быть 5000 или даже 10000. Существуют ли более быстрые способы вычисления псевдообратного (на самом деле, мне нужен только первый столбец, а не вся матрица при условии, что B равно нулю, кроме первой строки) учитывая разреженность матрицы (каждая строка содержит ровно два ненулевых значения, одно из которых всегда равно единице, а другое всегда отрицательно)

Какие математические библиотеки вы бы предложили использовать для этого? Лапак в порядке?

Я также открыт для любых других предложений, при условии, что они численно стабильны и асимптотически быстры (скажем, k*n^2, где k может быть большим).


person Radu Dan    schedule 19.08.2011    source источник


Ответы (2)


Подход SVD численно очень стабилен, но не очень быстр. Если вы используете SVD, то LAPACK — хорошая библиотека для использования. Если это просто одноразовое вычисление, то, вероятно, оно достаточно быстрое.

Если вам нужен значительно более быстрый алгоритм, вам, возможно, придется пожертвовать стабильностью. Одной из возможностей было бы использование QR-факторизации. Вам придется прочитать об этом, чтобы увидеть подробности, но часть рассуждений выглядит следующим образом. Если AP = QR (где P — матрица перестановок, Q — ортогональная матрица, а R — треугольная матрица) — экономическое QR-разложение A, то уравнение AX = B становится QRP^{-1} X = B и решение X = PR ^ {- 1} Q ^ T B. Следующий код Octave иллюстрирует это с использованием тех же A и B, что и в вашем коде.

[Q,R,P] = qr(A,0)
C(P) = R \ (Q' * B)

Хорошая вещь в этом заключается в том, что вы можете использовать разреженность A, выполняя разреженное QR-разложение. В справке Octave есть некоторое объяснение функции qr, но у меня это не сработало сразу.

Еще быстрее (но и менее стабильно) использовать нормальные уравнения: если AX = B, то A^TAX = A^T B. Матрица A^TA представляет собой квадратную матрицу (надеюсь) полного ранга, поэтому вы можете использовать любой решатель линейных уравнений. Октавный код:

C = (A' * A) \ (A' * B)

Опять же, в этом подходе можно использовать разреженность. Существует множество методов и библиотек для решения разреженных линейных систем; популярным является UMFPACK.

Добавлено позже: я недостаточно знаю об этом поле для количественной оценки. Об этом написаны целые книги. Возможно, QR примерно в 3 или 5 раз быстрее SVD, а нормальные уравнения снова вдвое быстрее. Влияние на числовую стабильность зависит от вашей матрицы A. Разреженные алгоритмы могут быть намного быстрее (скажем, в m раз), но их вычислительная стоимость и численная стабильность очень сильно зависят от проблемы, и иногда это не совсем понятно.

В вашем случае я бы порекомендовал попробовать вычислить решение с помощью SVD, посмотреть, сколько времени это займет, и, если это приемлемо, просто использовать его (я думаю, это будет около минуты для n = 1000 и m = 10000 ). Если вы хотите изучить его дальше, попробуйте также QR и нормальные уравнения и посмотрите, насколько они быстрее и насколько точны; если они дают примерно то же решение, что и SVD, то вы можете быть уверены, что они достаточно точны для ваших целей. Только если все они слишком медленные и вы готовы потратить на это некоторое время, посмотрите на разреженные алгоритмы.

person Jitse Niesen    schedule 20.08.2011
comment
В конце концов я остановился на нормальных уравнениях для простоты реализации. Точность приемлемая и реализована в CUDA, скорость у меня отличная (несколько секунд на моем GF 560 Ti). Спасибо за всю информацию! - person Radu Dan; 28.08.2011

Ваша проблема некорректна. Если вы рассматриваете проблему как функцию n переменных (наименьший квадрат разности), функция имеет ровно ОДНУ глобальную минимальную гиперплоскость.

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

Если то, что вам нужно, это параметризация гиперплоскости решения, вы можете получить это из Moore-Penrose Pseudo-Inverse http://en.wikipedia.org/wiki/Moore%E2%80%93Penrose_pseudoinverse и проверьте раздел получения всех решений.

(Обратите внимание, что я использовал слово «гиперплоскость» технически некорректно. Я имею в виду «плоское» неограниченное подмножество вашего пространства параметров... Линия, плоскость, что-то, что может быть параметризовано одним или несколькими векторами. Я почему-то не могу найти общее название для таких объектов)

person DanielOfTaebl    schedule 19.08.2011
comment
Ты прав. Я считаю, что дополнительное условие, о котором я забыл упомянуть, заключается в том, что все значения x[] являются строго положительными действительными числами. - person Radu Dan; 19.08.2011
comment
Ничего не меняет. Либо ваша гиперплоскость решения будет пересекаться с множеством всех положительных вещественных чисел, и в этом случае вы будете счастливы, либо нет, и в этом случае искомое решение является пределом при приближении к нулю. - person DanielOfTaebl; 19.08.2011
comment
Если я вас правильно понял (в чем я сейчас не совсем уверен), вы говорите, что существует бесконечное число гиперплоскостей, удовлетворяющих переопределенной системе, и их относительная ошибка стремится к нулю, когда x[] параметры приближаются к нулю. Если это так, я полностью с вами согласен, но вы, вероятно, упустили тот факт, что параметры x[] на самом деле не имеют значения, а только их относительные отношения (и, следовательно, они не равны нулю). Я пытаюсь минимизировать квадрат суммы их отношений за вычетом входных отношений. - person Radu Dan; 19.08.2011
comment
Хорошо, я думаю, что понимаю, к чему вы клоните, но вот ваша главная проблема: если вы умножите все свои переменные на t, ваша разность наименьших квадратов увеличится на t в квадрате. В вашей текущей формулировке это в конечном счете будет доминировать во всем, что вы попробуете. Вы хотите переформулировать задачу как функцию на гиперсфере, IE наложить условие, что x[1]^2 + x[2]^2 + x[3]^2 .... = 1? - person DanielOfTaebl; 19.08.2011
comment
Вы уверены, что две разности наименьших квадратов некоррелированы? При тестировании со случайными константами (a = 1, 2, 1000) псевдообратное решение методом наименьших квадратов, предоставленное Matlab, осталось тем же, только масштабировано другим коэффициентом. Что касается функции гиперсферы, я не знаю, в моих ли это интересах (на этом мои математические познания заканчиваются); Я пытаюсь определить хороший (надеюсь, оптимальный в некотором смысле минимизации ошибок) набор параметров из моих данных (возможно, неточных или противоречивых) входных данных. - person Radu Dan; 19.08.2011
comment
В этот момент, вероятно, проще всего спросить о каком-то контексте. Если вы утроите константу, вы получите разность наименьших квадратов в девять раз. Но если вы измените, какая переменная является константой, отношение соотношения не будет сохраняться. Что ж, это может сработать, я так и не выяснил, верен ли Мур-Пенроуз для сферического случая. - person DanielOfTaebl; 19.08.2011
comment
У меня 1000(n) видеокарт. У меня также есть около 10000 (m) отношений между ними, извлеченных из различных тестов (GeForce 560TI на 25% быстрее, чем обычная GeForce 560). Некоторые отношения противоречивы (Geforce 560 на 10% быстрее, чем GeForce 560TI), а другие лишь немного отличаются (560TI = 120% от 560). Конечная цель — отсортировать все видеокарты с агрегированными данными тестов, и именно поэтому мне нужны относительные соотношения производительности между ними. Метод наименьших квадратов применяется к частным, а не к самим значениям (относительные значения в любом случае не имеют значения сами по себе) - person Radu Dan; 19.08.2011
comment
Что касается тройной константы, девятикратной разности наименьших квадратов, я не могу сказать, что она меня сильно беспокоит, пока решение с разностью наименьших квадратов остается прежним (конечно, за вычетом масштабирования). - person Radu Dan; 19.08.2011
comment
Хорошо, я, наверное, должен перестать работать над этим и заняться своей работой. Но вечером выложу еще что-нибудь. - person DanielOfTaebl; 19.08.2011