Вопрос или проблема
Я хотел бы кластеризовать/сгруппировать кривые на приложенной картинке с помощью Python. Данные уже нормализованы, и мой подход заключается в использовании dtw (динамического временного выравнивания) для расчета расстояния, а затем с использованием этой функции применить алгоритм кластеризации (например, kmeans или DBSCAN) для их классификации.
Мне выбрать одну траекторию в качестве начальной кривой для сравнения с другими кривыми или рассчитать “среднюю” кривую из всех кривых и использовать ее в качестве начальной для сравнения?
Кроме того, я не совсем уверен, как интерпретировать расстояние dtw. Пожалуйста, посмотрите на код ниже:
from dtaidistance import dtw
import numpy as np
y=np.random.randint(0,10,10)
y1=y+2
dist=dtw.distance(y,y1)
Форма двух кривых должна быть абсолютно одинаковой, только смещенной по оси y, но dtw все равно вычисляет расстояние больше 0. Это связано с тем, что две кривые не нормализованы и, следовательно, не были бы выровнены точно друг над другом? У меня всегда было впечатление, что dtw измеряет сходство форм двух кривых и поэтому подвержен смещениям или растяжению. Я просто беспокоюсь о том, что если кривая имеет другую форму, но находится близко к сравниваемой кривой, расстояние dtw будет гораздо меньше, чем расстояние dtw двух абсолютно одинаковых, но смещённых кривых.
Динамическое временное выравнивание (DTW) предназначено для временных выравниваний. Вы сравниваете не временные выравнивания, добавляя константу между двумя временными рядами.
Вот пример временного выравнивания, смещая на 1 временную единицу между двумя временными рядами. Результатом является расстояние DTW равное 1.
from dtaidistance import dtw
import numpy as np
y = np.random.randint(0,10,10)
y1 = y[1:]
dist = dtw.distance(y, y1)
Я буду работать снизу вверх:
Я не совсем уверен, как интерпретировать расстояние dtw.
Динамическое временное выравнивание измеряет расстояние между рядами точек данных, где порядок точек данных в каждом ряду информативен. В вашем случае ваши точки данных — это измерения давления, а ваш информативный порядок сортировки — это положение в момент измерения.
Для примера давайте скажем, что у вас было два раунда измерений давления, отсортированных по позиции, на которой они были собраны, и хранящихся как два списка Python:
pressures_a = [10, 2, 1, 5, 60, 1]
pressures_b = [10, 3, 60]
По сути, динамическое временное выравнивание задается вопросом: “Каково наименьшее евклидово расстояние между этими двумя списками?” Я пропущу алгоритм, чтобы найти этот ответ, и сосредоточусь на информации, которая попадает в результат:
>>> imaginary_DTW_function(pressures_a, pressures_b, loss="abs")
Лучшие затраты на парное соответствие:
|10 - 10| = 0
| 2 - 3| = 1
| 1 - 3| = 2
| 5 - 3| = 2
|60 - 60| = 0
| 1 - 60| = 59
DTW Расстояние: 64
Обратите внимание, как финальный результат растягивает pressures_b
‘s 3
, чтобы избежать парного соответствия малых чисел с 60, но нет способа избежать этой огромной стоимости в конце: Все должно совпадать с чем-то, сохраняя порядок, позволяя любой части ряда “растянуться”.
“Расстояние DTW”, которое вы получаете, — это сумма “потерь” за лучшее выравнивание. В моей поддельной функции DTW я использовал абсолютное расстояние (также известное как L1, cityblock, 1D и т.д.). Реализации динамического временного выравнивания по умолчанию используют евклидово расстояние.
Форма двух кривых (
y
,y1
) должна быть абсолютно одинаковой, только смещенной по оси
y, но dtw все равно вычисляет расстояние больше 0.
Это связано с тем, что две кривые не нормализованы и затем
выровнены точно друг над другом?
Что касается вашего примера с y
и y1
: расстояние между совпадающими элементами между двумя есть по замыслу sqrt((x - (x+1))^2)
(что равно 1). У вас есть 10 таких элементов, так что DTW равно 10*.
Вы можете пропускать масштабированные или не масштабированные данные через динамическое временное выравнивание и получать очень разные (но оба информативные) результаты. Величина расстояния, которое вы получаете, зависит от ваших единиц.
Я хотел бы кластеризовать/сгруппировать кривые на приложенной картинке с
Python. Данные уже нормализованы, и мой подход заключается в использовании
dtw (динамического временного выравнивания) для расчета расстояния и с этой
функцией применить алгоритм кластеризации (например, kmeans или DBSCAN) для их классификации.Мне выбрать одну траекторию как начальную кривую для сравнения с другими
кривыми, или рассчитать “среднюю” кривую из всех кривых и использовать
ее как начальную кривую для сравнения?
Это отличный блог, если вы хотите получить больше интуиции о динамическом временном выравнивании, но вы найдете важный момент для кластеризации, если пропустите к разделу “Свойства”. Кратко говоря, динамическое временное выравнивание не является истинной метрикой (хотя на некоторых наборах данных вы можете проверить, ведет ли оно себя как истинная метрика!). Выбор или создание одной траектории для сравнения может быть катастрофическим/неинформативным.
Если вы думаете, что расстояние DTW является полезным сравнением с учетом ваших знаний в данной области, я бы начал с одного из следующих:
-
Постройте полную матрицу расстояний DTW для этого набора данных и передайте расстояние DBSCAN (
metric="precomputed"
док здесь). -
Существуют некоторые библиотеки, которые выполняют кластеризацию K-средних, используя динамическое временное выравнивание в качестве метрики. (например, tslearn TimeSeriesKMeans).
Вы всегда можете придумать более сложный подход для кластеризации на основе DTW или попробовать не-DTW подходы, но если это расстояние является разумным выбором для вашей задачи и вы хотите ознакомиться с результатами кластеризации DTW, я бы попробовал эти подходы.
*(В среднем, и если мы не разбудим людей с статистическими методами)
Ответ или решение
Кластеризация временных рядов с использованием динамического временного выравнивания (DTW)
Введение
Динамическое временное выравнивание (DTW) — это мощный инструмент для сравнения временных рядов, который позволяет находить оптимальное выравнивание между двумя рядами данных, даже если они могут быть разной длины или сдвинуты по времени. В данной статье мы обсудим, как использовать DTW для кластеризации временных рядов, опираясь на предоставленную информацию о давлении в кабине лифта.
Проблема
У вас уже есть нормализованные временные ряды, представляющие собой траектории давления в лифте. Цель состоит в том, чтобы сгруппировать эти кривые, используя DTW для вычисления расстояний и затем применить алгоритмы кластеризации, такие как KMeans или DBSCAN.
Использование DTW для расчета расстояния
Понимание расстояния DTW
DTW измеряет расстояние между двумя временными рядами, сопоставляя точки данных с целью минимизации общей "стоимости", которая определяется как сумма различий между сопоставленными точками. Это означает, что DTW чувствителен к временным смещениям и изменению масштаба. В вашем примере, где одна кривая была просто смещена по оси Y, центр масс мог бы измениться, что привело бы к ненулевому расстоянию DTW. Правильное выравнивание при использовании DTW, как показано в вашем коде, приходит к выводу, что для каждой пары точек хотя бы одна несоответствует.
Пример вашего кода:
from dtaidistance import dtw
import numpy as np
y = np.random.randint(0, 10, 10)
y1 = y + 2
dist = dtw.distance(y, y1)
Здесь dist
будет больше 0, поскольку точки имеют разницу, даже с одинаковой формой.
Подходы к кластеризации
Есть несколько методов для кластеризации, которые можно использовать с DTW:
-
Построение матрицы расстояний DTW:
Постройте полную матрицу расстояний DTW для вашего набора данных, а затем используйте эту матрицу как входные данные для DBSCAN, указывая параметрmetric="precomputed"
. Это позволит алгоритму DBSCAN выявить группы на основе заранее рассчитанных расстояний. -
Использование KMeans с DTW:
Существуют библиотеки, такие какtslearn
, которые обеспечивают реализацию KMeans, использующего DTW в качестве метрики. Пример:from tslearn.clustering import TimeSeriesKMeans model = TimeSeriesKMeans(n_clusters=3, metric="dtw") labels = model.fit_predict(your_data)
Выбор начальной кривой для сравнения
Рекомендуется избегать выбора произвольной начальной кривой для сравнения, так как это может привести к предвзятости в результатах. Вместо этого, лучшим методом будет создание полной матрицы расстояний, как упоминалось выше.
Заключение
Используя DTW для кластеризации временных рядов, можно эффективно выявлять скрытые закономерности и группы в данных. Матрица расстояний DTW служит надежным инструментом для этого процесса. Помните, что DTW, хотя и является мощным методом, не является "истинной метрикой", поэтому особое внимание стоит обратить на интерпретацию полученных результатов и выбор подходящего алгоритма кластеризации. Выбор правильного подхода к кластеризации с использованием DTW поможет более точно отобразить особенности данных и достичь поставленных целей.