Предположим, у вас есть следующий пример:
n = 4;
rng(0)
A = rand(n,n);
B = A * A';
Если матрица B
имеет полный ранг, вы не можете точно покрыть исходную матрицу, используя меньшее количество измерений. Таким образом, вы можете только аппроксимировать его. Ключевая идея здесь состоит в том, чтобы свести к минимуму ошибку реконструкции.
Вы можете разложить B
на собственные векторы, используя разложение по собственным значениям. Вы можете использовать eig
в MATLAB, но вам нужно отсортировать собственные значения и соответствующие собственные векторы впоследствии. Вместо этого я предпочитаю разложение по единственному числу и использую svd
в MATLAB. Обратите внимание, что SVD дает оптимальное решение для ошибки реконструкции в матричной аппроксимации низкого ранга.
[U,S,~] = svd(B);
U = U * sqrt(S);
Мы знаем, что B = U * U'
сейчас. См. взаимосвязь между SVD и разложением по собственным значениям здесь.
Как я уже сказал, нам нужно аппроксимировать его. Я выбираю размеры, покрывающие 99% общей дисперсии, следующим образом:
coverage = cumsum(diag(S.^2));
coverage = coverage ./ norm(S,'fro')^2;
[~, nEig] = max(coverage > 0.99);
U2 = U(:,1:nEig);
U2 имеет 2 столбца вместо 4 в этом случае. Если данные коррелированы, выигрыш будет еще меньше. Результаты приведены ниже:
B
B1 = U*U'
B2 = U2*U2'
B =
2.8966 2.1881 1.1965 2.1551
2.1881 1.9966 0.6827 1.8861
1.1965 0.6827 0.7590 0.5348
2.1551 1.8861 0.5348 2.0955
B1 =
2.8966 2.1881 1.1965 2.1551
2.1881 1.9966 0.6827 1.8861
1.1965 0.6827 0.7590 0.5348
2.1551 1.8861 0.5348 2.0955
B2 =
2.8896 2.2134 1.1966 2.1385
2.2134 1.9018 0.6836 1.9495
1.1966 0.6836 0.7586 0.5339
2.1385 1.9495 0.5339 2.0528
Кажется, это хорошее приближение.
person
petrichor
schedule
16.05.2012