Решите `A`` B` в матричном умножении `AB = Y` для произвольного` Y`, используя метод наименьших квадратов - PullRequest
0 голосов
/ 22 января 2019

Извините, если это дубликат какой-либо темы. Я знаю, что существует много разложений для разложения матрицы (например, LU или SVD), но теперь у меня есть произвольная неквадратная матрица, и я хочу разложить ее на произведение двух матриц заданной формы . Если точного решения не существует, я хочу найти метод наименьших квадратов. Если существует более одного решения, любое из них подойдет.

Я использовал итерационные методы, подобные этому:

A = np.random.rand(...)
B = np.random.rand(...)
for i in range(999):
    A = np.linalg.lstsq(B.T, Y.T, None)[0].T
    B = np.linalg.lstsq(A, Y, None)[0]

Это просто, но я обнаружил, что оно сходится сублинейно (на самом деле логарифмически), что медленно. Я также обнаружил, что иногда (или часто?) «Возвращается» к очень высокой потере L2. Мне интересно, есть ли улучшения в этом или просто решение AB=Y должно быть сделано совершенно другим способом?

Большое спасибо!

1 Ответ

0 голосов
/ 23 января 2019

Вы можете сделать это с SVD.См., Например, статью вики Предположим, например, что у вас есть матрица mxn Y и вы хотите найти факторизацию

Y = A*B where A is mx1 and B is nx1 

, чтобы

A*B 

былокак можно ближе (измеряется по норме Фробениуса) к Y.

Решение состоит в том, чтобы взять SVD Y:

Y = U*S*V'

, а затем принять

A = s*U1 (the first column of A, scaled by the first singular value)
B = V1' (the first column of V)

Если вы хотите, чтобы A было mx2, а B 2xn, то выберите первые два столбца (для A масштабирование первого столбца по первому единственному значению, второго столбца по второму единственному значению) и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...