Вопрос или проблема
У меня есть набор данных в формате GPS: широта, долгота. Я хочу обнаружить аномалии с помощью Python.
Я тестировал knn, smv, cof, iforest используя pycaret. Но у меня не получилось.
Эти цвета аномальны, потому что
- угол изменения слишком велик
- изменения точек сильно смещены вправо и влево
- расстояние между двумя точками слишком велико
Но поскольку остальные цвета идут в ряд, они не являются аномалиями, потому что значения направления разумны.
Также я группировал по sequnceUUID
Направление (угол) - это угол к северу.
Я хочу обнаружить и извлечь фиолетовые, зеленые и коричневые наборы данных, которые выходят за границы.
Данные GPS включают позиционные и временные данные. Если позиция n+1 в момент времени t+1 слишком далеко от позиции n в момент времени t (т.е. d>0.5 м, например), вы должны быть в состоянии обнаружить аномалию.
Та же тема с углом: если угол между d1 и d2 больше нормального значения (например: 2 градуса), то это следует считать аномалией.
Вы также должны учитывать количество аномальных значений подряд: если их больше 3, например, вы должны считать их аномалией.
Ответ или решение
Для обнаружения аномалий в данных GPS с использованием языка Python, необходимо принять во внимание особенности, связанные с перемещением объектов в пространстве. Ваша задача заключается в выявлении отклонений по критериям, связанным с расстоянием и углом, которые могут указывать на аномалии. В этой статье будет описан пошаговый процесс, который поможет вам в выполнении этой задачи.
1. Подготовка данных
Первым шагом является загрузка и предварительная обработка данных. Убедитесь, что ваши данные находятся в формате, который позволяет вам легко работать с ними. Формат GeoJSON подходит для этой задачи, так как содержит все необходимые координаты и временные метки.
import pandas as pd
import geopandas as gpd
# Загрузка данных
data = gpd.read_file("ваш_файл.geojson")
2. Расчет расстояний и углов
Для обнаружения аномалий по расстоянию между последовательными координатами можно использовать формулу Гаверсина, которая учитывает кривизну Земли.
from geopy.distance import great_circle
import numpy as np
# Функция для расчета угла между двумя векторами
def angle_between(p1, p2):
return np.arctan2(p2[1] - p1[1], p2[0] - p1[0]) * (180.0 / np.pi)
data['distance'] = data.apply(lambda row: great_circle((row['lat'], row['lon']), (row['lat'].shift(), row['lon'].shift())).meters, axis=1)
data['angle'] = data.apply(lambda row: angle_between((row['lat'], row['lon']), (row['lat'].shift(), row['lon'].shift())), axis=1)
3. Установка порогов для аномалий
Вам необходимо установить пороги для определения, является ли изменение расстояния или угла аномалией. Например, если расстояние между двумя точками превышает 0.5 метра или разница угла превышает 2 градуса, это будет рассматриваться как аномалия.
distance_threshold = 0.5 # порог для расстояния
angle_threshold = 2.0 # порог для угла
data['distance_anomaly'] = data['distance'] > distance_threshold
data['angle_anomaly'] = data['angle'].abs() > angle_threshold
4. Объединение аномалий
Теперь, когда вы проанализировали каждую пару точек, создайте условие для выявления последовательных аномалий. Если у вас есть более 3 последовательных отклонений, это будет считаться аномалией.
data['group'] = (data['distance_anomaly'] | data['angle_anomaly']).astype(int).groupby(data['sequenceUUID']).cumsum()
data['is_anomaly'] = data.groupby(['sequenceUUID', 'group'])['distance_anomaly'].transform(lambda x: x.rolling(3).sum() > 2)
5. Извлечение и визуализация данных аномалий
После идентификации аномалий вы можете извлечь и визуализировать их.
anomalies = data[data['is_anomaly']]
print(anomalies)
import matplotlib.pyplot as plt
plt.scatter(data['lon'], data['lat'], c='blue', label='Normal Data', alpha=0.5)
plt.scatter(anomalies['lon'], anomalies['lat'], c='red', label='Anomalies', alpha=0.8)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.legend()
plt.title('GPS Data Anomaly Detection')
plt.show()
Заключение
В этой статье мы рассмотрели, как можно обнаружить аномалии в GPS-данных, используя Python. Этот метод сочетает в себе подходы к анализу расстояний и углов, что делает его достаточно мощным для выявления различных отклонений. Не забывайте корректировать пороги в зависимости от характеристик ваших данных, чтобы улучшить качество обнаружения аномалий.