Рассмотрим следующее взвешенное решение нормального уравнения обратной задачи наименьших квадратов:
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).
d1
иd2
? Пожалуйста, опубликуйте исполняемый код. Кроме того,d = [d1;d2]
подразумевает, чтоw1
иw2
- это только единицы, аW
- этоeye
? Почему два диагональных сопоставления (последние две строки)? - person Luis Mendo   schedule 06.07.2015d = [d1;d2]
означаетlength(d1)==length(d2)
. Итак,w1
иw2
- это1
- person Luis Mendo   schedule 06.07.2015W = 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.2015W
не является диагональной, а представляет собой горизонтальную конкатенацию двух диагностических матриц. Это приведет к сбою инверсии матрицы, потому что это делаетG.'·W.'·WG
сингулярным. Можете ли вы проверить правильность кода, посмотрев наfull(W)
небольшую игрушечную проблему? - person Rody Oldenhuis   schedule 07.07.2015W
действительно диагональный, тогда вам лучше сделатьbsxfun(@times, G, [length(d2) length(d1)]/length(d))
для вычисленияG.' · W.'
. Что такоеWG
иWd
? - person Rody Oldenhuis   schedule 07.07.2015d1 = rand(3,1); d2 = rand(5,1);
, а затем выполню приведенный выше код для построенияW
, я не получу диагональную матрицу ... - person Rody Oldenhuis   schedule 08.07.2015