Эффективная настройка разреженных матриц в MATLAB для инверсии матриц

Рассмотрим следующее взвешенное решение нормального уравнения обратной задачи наименьших квадратов:

m = inv(G'*W'*W*G)*G'*W'*W*d

Я хотел бы настроить матрицу весов W, которая представляет собой квадратную диагональную матрицу с весами по диагонали.

Поскольку у меня есть большое количество точек данных в d (10⁷), моя системная матрица G также велика, но только в одном измерении (поскольку у меня гораздо больше точек данных, чем параметров модели). В случае 6 параметров модели G имеет размер (10⁷ × 6). Следовательно, W должен иметь размер (10⁷ × 10⁷). Однако он редкий, всего лишь 10⁷ ненулевых элементов (весов).

Чтобы уменьшить объем памяти, я использую sparse на W.

Чтобы назначить веса, я делаю следующее

d = [d1;d2];   
W = sparse(length(d),length(d)) 
w1 = length(d2)/length(d);
w2 = length(d1)/length(d);
W(1:length(d)+1:length(d)*length(d1)) = w1;
W(length(d)*length(d1)+1:length(d)+1:end) = w2;

d1 и d2 - векторы-столбцы с наблюдениями.

Это приведет к присвоению веса диагонали, но это ужасно медленно.

Мой вопрос:

Могу я либо

  • Как-то ускорить отнесение весов к диагонали, или
  • Перепишите m = inv(G'*W'*W*G)*G'*W'*W*d, чтобы мне вообще не пришлось W настраивать?

Примечание 1: веса - это две разные константы, но на практике они будут варьироваться в зависимости от диагонали!

Примечание 2: узким местом кода действительно является установка W, а не сама инверсия, поскольку инвертированная матрица имеет только размер (6 × 6).


person TheodorBecker    schedule 06.07.2015    source источник
comment
Что такое d1 и d2? Пожалуйста, опубликуйте исполняемый код. Кроме того, d = [d1;d2] подразумевает, что w1 и w2 - это только единицы, а W - это eye? Почему два диагональных сопоставления (последние две строки)?   -  person Luis Mendo    schedule 06.07.2015
comment
@LuisMendo Я редактировал код. Однако я не понимаю, почему W. w1 и w2 - это веса, в данном случае зависящие от длины соответствующего вектора наблюдения. Но они могли быть любыми поплавками.   -  person TheodorBecker    schedule 06.07.2015
comment
d = [d1;d2] означает length(d1)==length(d2). Итак, w1 и w2 - это 1   -  person Luis Mendo    schedule 06.07.2015
comment
d = [d1; d2] - это вертикальная конкатенация векторов n x 1 и m x 1 и, как таковая, не подразумевает ничего по длине d1 и d2, кроме длины (d1) + length (d2) = length (d).   -  person TheodorBecker    schedule 06.07.2015
comment
Ах хорошо. Я думал, что это векторы-строки. Вы должны указать, что в вопросе   -  person Luis Mendo    schedule 06.07.2015
comment
Вы пробовали использовать W = sparse([1:numel(d1) 1:numel(d2)], 1:numel(d), [w1; w2], numel(d), numel(d));, где w1 и w2 - векторы столбцов? Это заменяет инициализацию W = sparse(length(d),length(d)); и две строки назначения   -  person Luis Mendo    schedule 06.07.2015
comment
@LuisMendo: Отлично, я не осознавал, что такая инициализация разреженных матриц возможна. Об этом даже рассказывают в документальном фильме. Это быстрее на несколько порядков. Большое спасибо!   -  person TheodorBecker    schedule 06.07.2015
comment
Если матрица весов диагональна, то W '= W и W'W также является диагональной матрицей с квадратами весов на диагонали. Я думаю, что это можно представить в виде вектора и обработать специально при умножении.   -  person duffymo    schedule 06.07.2015
comment
С предоставленным вами кодом ваша матрица W не является диагональной, а представляет собой горизонтальную конкатенацию двух диагностических матриц. Это приведет к сбою инверсии матрицы, потому что это делает G.'·W.'·WG сингулярным. Можете ли вы проверить правильность кода, посмотрев на full(W) небольшую игрушечную проблему?   -  person Rody Oldenhuis    schedule 07.07.2015
comment
Если W действительно диагональный, тогда вам лучше сделать bsxfun(@times, G, [length(d2) length(d1)]/length(d)) для вычисления G.' · W.'. Что такое WG и Wd?   -  person Rody Oldenhuis    schedule 07.07.2015
comment
@RodyOldenhuis: Я отредактировал сообщение. Это было не очень удобно. Теперь знаки умножения должны прояснить ситуацию. W действительно диагональна и была действительно диагональной, также с моим первым подходом. Я проверил это с полной на подмножестве.   -  person TheodorBecker    schedule 07.07.2015
comment
Но если я сделаю d1 = rand(3,1); d2 = rand(5,1);, а затем выполню приведенный выше код для построения W, я не получу диагональную матрицу ...   -  person Rody Oldenhuis    schedule 08.07.2015


Ответы (1)


По структуре W я бы сказал, что более эффективно разделить G на две половины и вычислить продукты с W как скалярные произведения:

G1 = G(1:length(d1),:);
G2 = G(length(d1)+1:end,:);

m = (w1^2*G1'*G1 + w2^2*G2'*G2) \ (w1^2*G1'*d1 + w2^2*G2'*d2);

Кроме того, обычно используйте A \ b вместо inv(A)*b (даже если A маленький).

person chtz    schedule 26.03.2018