May 9, 2022

Легкий способ подсчета расстояния при наличии пропусков в данных

Для решения проблемы наличия аномалий в данных в библиотеках машинного обучения предусмотрены различные приемы. Одним из них является подсчет расстояний между векторами при наличии пропусков в координатах. В частности, популярным является использование функции nan_euclidean_distance, которая включает в евклидову метрику только заполненные параметры, однако взвешивает результат в соответствии с количеством незаполненных значений по следующей формуле:

Рассмотрим использование nan_euclidean_distance на примере датафрейма:

import numpy as np
import pandas as pd

df = pd.DataFrame([[12, np.nan, 24], [1, 2, 3], [6, 3, np.nan], [1, 6, 8]])
df

Импортируем nan_euclidean_distances из sklearn.metrics.pairwise и посчитаем расстояние между нулевой и первой строкой:

from sklearn.metrics.pairwise import nan_euclidean_distances

nan_euclidean_distances(X=[df.iloc[0]],Y=[df.iloc[1]])

сравним с подсчетом вручную:

np.sqrt(3/2*np.sum([np.power(12-1,2),np.power(24-3,2)]))

Для получения дистанций между группами объектов в X и Y можно передавать списки:

nan_euclidean_distances(X=[df.iloc[0]], Y=df.iloc[1:])
nan_euclidean_distances(X=[df.iloc[2]], Y=df.drop(2))

Если Y не передается, то по умолчанию он будет равен X:

nan_euclidean_distances(X=df)