Ожидаемое поведение sklearn pairwise_distances с force_all_finite = False? - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь использовать sklearn's pairwise_distances для массивов, содержащих NaN, без заполнения NaN. Пример минимального кода для воспроизведения проблемы:

import numpy as np
from sklearn.metrics import pairwise_distances

X = np.array([[1,2],[2,3],[1,np.nan]])
res = pairwise_distances(X, force_all_finite=False)

возвращает

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

Поведение с force_all_finite = True идентично. Вместо этого я бы предпочел, чтобы расстояния до точек с NaN были просто самим NaN. Я ожидал, что это будет поведение с параметром force_all_finite = False, однако один и тот же ValueError вызывается независимо от того, как установлен force_all_finite, заставляя меня задуматься, каково ожидаемое поведение этого параметра на самом деле? Есть идеи для обхода?

Windows 10 с Anaconda Python 3.7.3, sklearn 0.2.22.post1.

1 Ответ

0 голосов
/ 22 апреля 2020

Я нашел простое решение своей проблемы, возможно, это может быть полезно другим пользователям sklearn pairwise_distances со значениями nan:

Оказывается, scipy cdist / pdist уже имеет ту функциональность, которой мне не хватало, например:

import numpy as np
from scipy.spatial.distance import cdist

X = np.array([[1,2],
              [2,3],
              [np.nan,np.nan]])
res = cdist(X,X)

дает

array([[0.        , 1.41421356,        nan],
       [1.41421356, 0.        ,        nan],
       [       nan,        nan,        nan]])

по желанию.

...