Агломеративная иерархическая кластеризация в Python с использованием расстояния DTW

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

Я новичок как в области науки о данных, так и в 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()

Ответы на ваши вопросы

  1. Как предоставить метрические данные для функции linkage?

    Необходимо вычислить матрицу расстояний с помощью вашей кастомной функции, а затем использовать этот массив в функции linkage. scipy будет ожидать, что вы передадите в качестве первого аргумента матрицу или вектор расстояний, как мы сделали выше с distance_matrix.

  2. Как установить свою пользовательскую функцию расстояния?

    Мы определили функцию dtw_distance для вычисления расстояния DTW между временными рядами. Затем мы использовали эту функцию в pdist для вычисления матрицы расстояний.

Заключение

Агломеративная иерархическая кластеризация с использованием DTW — это мощный инструмент для анализа временных рядов. Следуя предложенным шагам, вы сможете настроить процесс кластеризации на основе данных вашего набора. Не забудьте установить необходимые библиотеки (mlpy, scipy, matplotlib) перед запуском кода.

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

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