Как выполнять обнаружение аномалий в GPS-данных на Python

Вопрос или проблема

У меня есть набор данных в формате GPS: широта, долгота. Я хочу обнаружить аномалии с помощью Python.

Я тестировал knn, smv, cof, iforest используя pycaret. Но у меня не получилось.

Эти цвета аномальны, потому что

  • угол изменения слишком велик
  • изменения точек сильно смещены вправо и влево
  • расстояние между двумя точками слишком велико

Но поскольку остальные цвета идут в ряд, они не являются аномалиями, потому что значения направления разумны.

Также я группировал по sequnceUUID

Направление (угол) - это угол к северу.

Изображение моего набора данных

Я хочу обнаружить и извлечь фиолетовые, зеленые и коричневые наборы данных, которые выходят за границы.

мой набор данных в формате geojson

Данные 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. Этот метод сочетает в себе подходы к анализу расстояний и углов, что делает его достаточно мощным для выявления различных отклонений. Не забывайте корректировать пороги в зависимости от характеристик ваших данных, чтобы улучшить качество обнаружения аномалий.

Оцените материал
Добавить комментарий

Капча загружается...