- Вопрос или проблема
- Ответ или решение
- Агломеративная иерархическая кластеризация в Python с использованием расстояния DTW
- Шаг 1: Загрузка данных
- Шаг 2: Определение функции для вычисления расстояния DTW
- Шаг 3: Вычисление матрицы расстояний
- Шаг 4: Выполнение агломеративной иерархической кластеризации
- Ответы на ваши вопросы
- Заключение
Вопрос или проблема
Я новичок как в области науки о данных, так и в Python.
У меня есть набор данных временных образцов, для которых я хочу провести агломеративную иерархическую кластеризацию. Я обнаружил, что метод динамического выравнивания по времени (DTW) полезен для нахождения выравниваний между двумя временными рядами, которые могут варьироваться по времени или скорости.
Я нашел dtw_std
в библиотеке mlpy
и scipy.cluster.hierarchy
в SciPy
, чтобы кластеризовать мои данные.
Из документации scipy я узнал, что могу использовать свою собственную функцию расстояния:
metric : str или функция, необязательный Параметр расстояния, который используется в
случае, если y – это коллекция векторов наблюдений; в противном случае игнорируется.
Посмотрите функцию pdist для списка допустимых метрик расстояния. Также может быть использована пользовательская
функция расстояния.
Но я застрял на этапе сопоставления этой информации для реализации кластеризации.
Мой набор данных в формате dataframe
, где каждая строка соответствует образцу.
Вот мои вопросы:
1- Как я могу предоставить матрицы расстояний для функции связывания?
2- Как установить свою пользовательскую функцию расстояния?
import pandas as pd
import scipy.cluster.hierarchy as hac
import mlpy
dataset = pd.read_csv("dataset.csv", encoding='utf-8')
X # матрицы расстояний
Z = hac.linkage(X, metrics=mlpy.dtw_std, method='average')
cluster = hac.fcluster(Z, t=100, criterion='maxclust')
leader = hac.leaders(Z, t=100, criterion='maxclust')
fig = plt.figure(figsize=(25, 10))
dn = dendrogram(Z)
plt.show()
редактировать:
Вот как я вычисляю матрицу расстояний, а затем передаю ее в связывание:
# вычисление матрицы расстояний
dm = pdist(dataset, lambda u, v: mlpy.dtw_std(pd.Series(u).dropna().values.tolist(), pd.Series(v).dropna().values.tolist(), dist_only=True))
z = hac.linkage(dm, method='average')
cluster = hac.fcluster(z, t=100, criterion='maxclust')
leader = scipy.cluster.hierarchy.fcluster(z, t=100, criterion='maxclust')
Используйте заранее вычисленную матрицу расстояний и distance="precomputed"
.
HAC все равно вычислит матрицу расстояний.
Ответ или решение
Агломеративная иерархическая кластеризация в Python с использованием расстояния DTW
Агломеративная иерархическая кластеризация (HAC) является мощным методом для группировки временных рядов, особенно когда временные ряды могут иметь разные длины или скорости. Один из способов измерения подобия между временными рядами — это использование метода динамического временного выравнивания (DTW).
В этом ответе мы рассмотрим, как выполнить агломеративную иерархическую кластеризацию с помощью DTW в Python, используя библиотеки mlpy
и scipy
.
Шаг 1: Загрузка данных
Сначала загрузим ваши данные. Предположим, что ваш набор данных представлен в формате CSV, где каждая строка содержит данные для одного временного ряда.
import pandas as pd
# Загрузка набора данных
dataset = pd.read_csv("dataset.csv", encoding='utf-8')
Шаг 2: Определение функции для вычисления расстояния DTW
Для использования DTW в агломеративной иерархической кластеризации необходимо создать функцию для вычисления матрицы расстояний. Мы используем функцию pdist
из библиотеки scipy
вместе с mlpy
.
import mlpy
from scipy.spatial.distance import pdist, squareform
# Функция для расчёта расстояния DTW
def dtw_distance(u, v):
return mlpy.dtw_std(u, v, dist_only=True)
Шаг 3: Вычисление матрицы расстояний
Затем вычислим матрицу расстояний с использованием нашей функции dtw_distance
. В конечном счете мы будем использовать эту матрицу в функции linkage
.
# Вычисление матрицы расстояний
distance_matrix = pdist(dataset.values, metric=dtw_distance)
Обратите внимание, что dataset.values
преобразует DataFrame в массив NumPy.
Шаг 4: Выполнение агломеративной иерархической кластеризации
Теперь вы можете использовать полученную матрицу расстояний, чтобы выполнить агломеративную иерархическую кластеризацию.
import scipy.cluster.hierarchy as hac
import matplotlib.pyplot as plt
# Выполнение агломеративной иерархической кластеризации
Z = hac.linkage(distance_matrix, method='average')
# Получение кластеров
clusters = hac.fcluster(Z, t=100, criterion='maxclust')
# Построение дендрограммы
plt.figure(figsize=(25, 10))
dn = hac.dendrogram(Z)
plt.show()
Ответы на ваши вопросы
-
Как предоставить метрические данные для функции
linkage
?Необходимо вычислить матрицу расстояний с помощью вашей кастомной функции, а затем использовать этот массив в функции
linkage
.scipy
будет ожидать, что вы передадите в качестве первого аргумента матрицу или вектор расстояний, как мы сделали выше сdistance_matrix
. -
Как установить свою пользовательскую функцию расстояния?
Мы определили функцию
dtw_distance
для вычисления расстояния DTW между временными рядами. Затем мы использовали эту функцию вpdist
для вычисления матрицы расстояний.
Заключение
Агломеративная иерархическая кластеризация с использованием DTW — это мощный инструмент для анализа временных рядов. Следуя предложенным шагам, вы сможете настроить процесс кластеризации на основе данных вашего набора. Не забудьте установить необходимые библиотеки (mlpy
, scipy
, matplotlib
) перед запуском кода.