Я работаю над задачей обнаружения аномалий, используя KMeans.
Используемый мною фрейм данных Pandas имеет одну особенность, похожую на следующую:
df = array([[12534.],
[12014.],
[12158.],
[11935.],
...,
[ 5120.],
[ 4828.],
[ 4443.]])
Я могу подгонять и прогнозировать значения с помощью следующих инструкций:
km = KMeans(n_clusters=2)
km.fit(df)
km.predict(df)
Чтобы выявить аномалии, я хотел бы рассчитать расстояние между центроидом и каждой отдельной точкой, но с кадром данных с одной особенностью я не уверен, что это правильный подход.
Я нашел примеры, которые использовали евклидово расстояние для вычисления расстояния.Пример следующий:
def k_mean_distance(data, cx, cy, i_centroid, cluster_labels):
distances = [np.sqrt((x - cx) ** 2 + (y - cy) ** 2) for (x, y) in data[cluster_labels == i_centroid]]
return distances
centroids = self.km.cluster_centers_
distances = []
for i, (cx, cy) in enumerate(centroids):
mean_distance = k_mean_distance(day_df, cx, cy, i, clusters)
distances.append({'x': cx, 'y': cy, 'distance': mean_distance})
Этот код не работает для меня, потому что центроиды в моем случае похожи на следующий, так как у меня есть один фрейм данных:
array([[11899.90692187],
[ 5406.54143126]])
В этом случае, как правильно найти расстояние между центроидом и точками?Возможно ли это?
Спасибо и простите за тривиальный вопрос, я все еще учусь