Numpy точка возвращает разные значения - PullRequest
1 голос
/ 28 апреля 2020

Numpy точка возвращает различные значения после нормализации. У меня есть две функции, которые должны были возвращать одинаковые значения.

import numpy as np
from sklearn.preprocessing import normalize

def foo1(x, y):
    with np.errstate(invalid='ignore'):
        x_norm = np.nan_to_num(x / (np.linalg.norm(x, axis=0)))
    z = np.dot(x_norm, y / np.linalg.norm(y))
    print(z)

def foo2(x, y):
    x_norm = normalize(x, axis=0)
    z = np.dot(x_norm, normalize(y))
    print(z)

Пример минимальной воспроизводимости

x = np.array([[1, 2, 3],
              [4, 5, 6]])
y = np.array([[1], [2], [3]])
foo1(x, y)
foo2(x, y)

Вывод

[[0.62190562]
 [1.47271032]]
[[1.0611399 ]
 [2.79304638]]

Ожидаемое первое значение.

1 Ответ

2 голосов
/ 28 апреля 2020

Итак, ваша проблема связана с тем, что y - это матрица 3x1. Когда вы звоните normalize, он нормализуется по второй оси (axis=1), где он нормализует каждое значение по отдельности. Так что

normalize(y) -> array([[1.], [1.], [1.]])

, когда вместо этого вы хотите

normalize(y, axis=0) -> array([[0.26726124], [0.53452248], [0.80178373]])

При внесении этого изменения обе ваши функции вернут одно и то же значение [[0.62190562] [1.47271032]]

...