Используйте неконтролируемых ближайших соседей с NaN - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу использовать ближайших соседей без присмотра, и в моих данных есть NaN.Я хочу, чтобы, когда для записи была выбрана функция NaN, она не учитывает расстояние с какой-либо другой записью.Заполнение NaN 0, сделает его близким к другим записям со значением, близким к 0, и далеко от значения, далеким от 0, так что это не будет работать.

Я создал евклидову метрику, которая делает это, так как NaN распространяется для- и **, но 0 для nansum.Тем не менее я все еще получаю сообщение об ошибке из-за NaN.

Есть ли способ исправить эту ошибку?Я бы посоветовал использовать другой модуль, кроме sklearn, если это необходимо.

from sklearn.neighbors import NearestNeighbors
def metric(x1,x2):
    return np.nansum((x1-x2)**2) 
nn = NearestNeighbors(n_neighbors=10, metric=metric, n_jobs=-1)
nn.fit(x)

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

Я имею в виду, что я хочу, чтобы, если в записи был NaN для 10-й функции (например), 10-я функция не учитывалась врасстояние до любой другой записи, поэтому запись будет одинаково близка к любой другой записи, независимо от того, имеют ли они -1, 0, 13 или любое другое число для 10-й функции.

Удаление записей с NaN приведет кне работает, это на самом деле будет отбрасывать все записи.Установка NaN на 0 или любые другие числа также не будет работать.Я хочу замаскировать NaN из суммы расстояний для всех объектов.

1 Ответ

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

У меня была такая же проблема при реализации классификатора kNN для данных с пропущенными значениями.При вызове метода fit () scikit-learn проверяет наличие в данных nans, а затем выдает ошибку.Я не нашел решения и закончил тем, что написал свой собственный классификатор kNN.

Предполагая, что ваши данные масштабируются до среднего значения 0 и дисперсии единицы, замена nan на 0 не является хорошей идеей, как вы уже заявили.Итак, я также решил игнорировать особенность в вычислении расстояния между двумя выборками, если хотя бы одно значение равно nan.Однако это увеличивает вероятность того, что выборки со многими пропущенными значениями будут иметь небольшие расстояния до других выборок.Поэтому имеет смысл нормализовать расстояние по количеству объектов, где завершены обе выборки, и рассматривать выборки в качестве ближайших соседей только тогда, когда минимальное количество объектов имеет значения в обеих выборках.

...