Функция mrdivide в MATLAB: что она делает и как я могу сделать это в Python? - PullRequest
8 голосов
/ 17 июня 2009

У меня есть эта строка кода MATLAB:

a/b

Я использую эти входы:

a = [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]   
b = ones(25, 18)

Это результат (матрица 1x25):

[5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

Что делает MATLAB? Я пытаюсь продублировать это поведение в Python, и документация mrdivide в MATLAB оказалась бесполезной. Откуда берется 5 и почему остальные значения 0?

Я пробовал это с другими входами и получаю схожие результаты, обычно это просто первый элемент и нули, заполняющие оставшуюся часть матрицы. В Python, когда я использую linalg.lstsq(b.T,a.T), все значения в первой возвращенной матрице (т.е. не в единственном числе) равны 0,2. Я уже пробовал правильное деление в Python, и оно дает что-то совершенно неправильное.

Я понимаю, что такое приближение наименьших квадратов, мне просто нужно знать, что делает mrdivide.

Связанный:

Ответы [ 3 ]

8 голосов
/ 01 апреля 2013

MRDIVIDE или оператор / фактически решает линейную систему xb = a, в отличие от MLDIVIDE или оператора \, который решит систему bx = a.

Чтобы решить систему xb = a с несимметричной, необратимой матрицей b, вы можете либо положиться на mridivide(), что выполняется посредством факторизации b с исключением Гаусса, либо pinv() , что делается через разложение по сингулярным значениям и обнуление сингулярных значений ниже (по умолчанию) уровня допуска.

Вот разница (для случая mldivide): В чем разница между PINV и MLDIVIDE, когда я решаю A * x = b?

Когда система переопределена, оба алгоритма обеспечивают тот же ответ. Когда система недоопределена, PINV вернет решение x, которое имеет минимальную норму (min NORM (x)). MLDIVIDE будет выберите решение с наименьшим количеством ненулевых элементов.

В вашем примере:

% solve xb = a
a = [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9];
b = ones(25, 18);

система недоопределена, и два разных решения будут:

x1 = a/b; % MRDIVIDE: sparsest solution (min L0 norm) 
x2 = a*pinv(b); % PINV: minimum norm solution (min L2)

>> x1 = a/b
Warning: Rank deficient, rank = 1,  tol = 2.3551e-014.
ans =

    5.0000 0 0 ... 0 

>> x2 = a*pinv(b)
ans =

    0.2 0.2 0.2 ... 0.2 

В обоих случаях ошибка аппроксимации xb-a является пренебрежимо малой (неточное решение), и то же самое, т. Е. norm(x1*b-a) и norm(x2*b-a) будут возвращать один и тот же результат.

Что делает MATLAB?

Великолепная разбивка алгоритмов (и проверок свойств), вызываемых оператором '\', в зависимости от структуры матрицы b приведена в этом посте в scicomp.stackexchange.com . Я предполагаю, что аналогичные параметры применяются для оператора /.

В вашем примере, MATLAB, скорее всего, выполняет исключение по Гауссу, предоставляя самое разреженное решение среди бесконечности (отсюда и 5).

Что делает Python?

Python, в linalg.lstsq используется псевдообратная / SVD, как показано выше (поэтому вы получаете вектор 0,2). По сути, следующее даст вам тот же результат, что и MATLAB pinv():

from numpy import *

a = array([1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9])
b = ones((25, 18))

# xb = a: solve b.T x.T = a.T instead 
x2 = linalg.lstsq(b.T, a.T)[0]
x2 = dot(a, linalg.pinv(b)) 
2 голосов
/ 17 июня 2009

a / b находит решение наименьших квадратов для системы линейных уравнений bx = a

если b обратимо, то это * inv (b), но если это не так, то это x, которое минимизирует норму (bx-a)

Вы можете узнать больше о наименьших квадратах в википедии .

согласно документации matlab , mrdivide вернет не более k ненулевых значений, где k - вычисленный ранг b. Я предполагаю, что Matlab в вашем случае решает проблему наименьших квадратов, заданную заменой b на b (: 1) (который имеет такой же ранг). В этом случае обратное значение Мура-Пенроуза b2 = b(1,:); inv(b2*b2')*b2*a' определяется и дает тот же ответ

1 голос
/ 17 июня 2009

Per этот удобный "шпаргалка" numpy для пользователей Matlab, linalg.lstsq(b,a) - linalg is numpy.linalg.linalg , облегченная версия полный scipy.linalg.

...