Различные результаты в Matlab и Python для умножения матриц и возведения в степень - PullRequest
0 голосов
/ 09 февраля 2019

При переходе на Python из Matlab я получаю разные результаты для умножения и возведения в степень матрицы.

Это простая реализация классификатора softmax.Я запускаю код Python, экспортирую переменные как файл mat и запускаю исходный код Matlab, загружаю переменные, экспортированные из Python, и сравниваю их.

Код Python:

f = np.array([[4714, 4735, 4697], [4749, 4748, 4709]])
f = f.astype(np.float64)
a = np.array([[0.001, 0.001, 0.001], [0.001, 0.001, 0.001], [0.001, 0.001, 0.001]])

reg = f.dot(a)
omega = np.exp(reg)
sumomega = np.sum(omega, axis=1)

io.savemat('python_variables.mat', {'p_f': f,
                                    'p_a': a,
                                    'p_reg': reg,
                                    'p_omega': omega,
                                    'p_sumomega': sumomega})

Код Matlab:

f = [4714, 4735, 4697; 4749, 4748, 4709];
a = [0.001, 0.001, 0.001; 0.001, 0.001, 0.001; 0.001, 0.001, 0.001];

reg = f*a;
omega = exp(reg);
sumomega = sum(omega, 2);
load('python_variables.mat');

Я сравниваю результаты, проверяя следующее:

norm(f - p_f) = 0
norm(a - p_a) = 0
norm(reg - p_reg) = 3.0767e-15
norm(omega - p_omega) = 4.0327e-09
norm(omega - exp(p_f*p_a)) = 0

Таким образом, разница, по-видимому, вызвана умножением, и она становится намного больше с exp ().И моя исходная матрица данных больше, чем эта.Я получаю гораздо большие значения omega:

norm(reg - p_reg) = 7.0642e-12
norm(omega - p_omega) = 1.2167e+250

Это также приводит к тому, что в некоторых случаях sumomega обращается к inf или к нулю в Python, но не в Matlab, поэтому выходные данные классификатора отличаются.

Чтоя здесь скучаю?Как я могу исправить, чтобы получить точно такие же результаты?

1 Ответ

0 голосов
/ 09 февраля 2019

Разница для меня выглядит как численная точность.При операциях с плавающей точкой порядок операций имеет значение.Вы получаете (немного) разные результаты при переупорядочении операций, потому что округление происходит по-разному.

Вполне вероятно, что Python и MATLAB реализуют умножение матриц немного по-разному, и, следовательно, не следует ожидать абсолютно одинаковых результатов.

Если вам нужно повысить e до степени результата этого умножения, вы получите результат с более высокой степенью неточности.Это просто природа арифметики с плавающей точкой.

Проблема здесь не в том, что вы не получаете одинаковый результат в MATLAB и Python, а в том, что оба дают неточные результаты, и вы незнать, какую точность вы получаете.


Функция softmax, как известно, переполняется.Решение состоит в том, чтобы вычесть максимальное входное значение из всех входных значений.См. этот другой вопрос для более подробной информации.

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