как кластеризовать данные временного ряда, имеющие разные размеры векторов в R - PullRequest
1 голос
/ 01 октября 2019

Меня интересует кластеризация данных временных рядов, которые у меня есть, на 6 групп. данные, которые у меня есть, представляют каждую строку как данные одного временного ряда, и вот так у меня есть от 800 до 1000 данных временных рядов. но данные каждого временного ряда имеют разную длину, например, данные временного ряда '1' имеют 102 значения;данные временного ряда '2' имеют 56 значений;данные временного ряда «3» имеют 180 значений и т. д.… примерные данные, которые у меня есть в excel, показаны следующим образом:

  A    B    C    D    E    F    G    H    I    J    K    L    M    N    O    P    Q    R    S    T
1 7.4  8.1  8.5  9.1  9.6  10.2 10.7 11.3 11.9
2 7.3  7.6  7.9  8.2  8.5  8.8  9.1  9.4  9.7  10.1 10.4 10.7 11.5
3 7.6  8.1  8.6  9.1  9.6  10.2 10.7 11.8
4 7.4  7.8  8.4  8.9  9.4  10.0 10.5 11.1 11.6 12.3 12.8 13.4 13.5 13.9 14.4 14.9 15.4

Я не знаю, как обрабатывать неравные отрезки времени. данные серии для кластеризации

как рассчитать dtw между двумя данными временных рядов.

для данных временного ряда, имеющих одинаковую длину, он работает с кодом следующим образом:

library(dtw)

dm <- dist(sample1, method= "DTW")
hc <- hclust(dm, method="average")

 plot(hc, labels=Labels, 
 cex = 0.5, 
 hang = -1, 
 col = 'blue',
 main="cluster dendrogram")

rect.hclust(hc, k = 6) # displays the groups in the plot

есть ли способ сделать все имеющиеся у меня временные ряды равными по длине,потому что, если данные временного ряда не имеют одинаковую длину, вычисление евклидовых расстояний / dtw, вычисление любой другой функции и т. д. невозможно.

Я ищу код и подробный подход для обработки таких данных

заранее спасибо

Ответы [ 3 ]

1 голос
/ 01 октября 2019

Используя данные, воспроизводимые в примечании в конце, мы можем выровнять каждый из них по прямой линии и затем кластеризовать уклоны.

library(Ckmeans.1d.dp) # univariate clustering package

slopes <- coef(lm(t(DF) ~ seq_along(DF)))[2, ]
fm <- Ckmeans.1d.dp(slopes)

# graph the slopes on X axis identifying each and
# coloring each cluster with a different color
plot(fm)
text(slopes, 1, 1:4, adj = 0:-1)

[продолжение после графика]

screenshot

library(zoo)

# plot each series with each cluster having a different color
plot(zoo(t(DF)), screen = 1, col = fm$cluster)

[продолжение после сюжета]

screenshot

Примечание

Ввод в воспроизводимой форме:

Lines <- "row A    B    C    D    E    F    G    H    I    J    K    L    M    N    O    P    Q    R    S    T
1 7.4  8.1  8.5  9.1  9.6  10.2 10.7 11.3 11.9
2 7.3  7.6  7.9  8.2  8.5  8.8  9.1  9.4  9.7  10.1 10.4 10.7 11.5
3 7.6  8.1  8.6  9.1  9.6  10.2 10.7 11.8
4 7.4  7.8  8.4  8.9  9.4  10.0 10.5 11.1 11.6 12.3 12.8 13.4 13.5 13.9 14.4 14.9 15.4"
DF <- read.table(text = Lines, header = TRUE, fill = TRUE)[-1]
0 голосов
/ 01 октября 2019

вы могли бы потенциально попытаться обнаружить мотивы во временном ряду как средство нахождения сходства, то есть найти более короткие сегменты временного ряда, которые похожи, а не сходство, основанное на всей длине временного ряда. Однако без некоторого понимания предметной области, проблем и т. Д. Трудно определить, подходит ли это.

Символьная агрегированная аппроксимация (SAX) алгоритмы кластеризации на основе этого позволяют.

0 голосов
/ 01 октября 2019

Я не знаю много о том, как кластеризовать временные ряды, но я попробовал метод, представленный в примере OP, на временных рядах неравной длины, и он, кажется, работает нормально ... и он должен: согласно авторамdtw пакет,

Функция выполняет динамическую деформацию времени (DTW) и вычисляет оптимальное выравнивание между двумя временными рядами x и y, заданными в виде числовых векторов. «Оптимальное» выравнивание минимизирует сумму расстояний между выровненными элементами. Длины x и y могут различаться .

Сначала загрузите библиотеки

library(dtw); library(ggplot2)

, затем создайте временной ряд

xlist <- list(x1 = c(7.4, 8.1, 8.5, 9.1, 9.6, 10.2, 10.7, 11.3, 11.9)
              x2 = c(7.3, 7.6, 7.9, 8.2, 8.5, 8.8, 9.1, 9.4, 9.7, 10.1,
                     10.4, 10.7, 11.5)
              x3 = c(7.6, 8.1, 8.6, 9.1, 9.6, 10.2, 10.7, 11.8)
              x4 = c(7.4, 7.8, 8.4, 8.9, 9.4, 10, 10.5, 11.1, 11.6, 12.3,
                     12.8, 13.4, 13.5, 13.9, 14.4, 14.9, 15.4))

... которые выглядят так

df <- stack(xlist)
df$i <- unlist(lapply(xlist, seq_along))

ggplot(df, aes(i, values, color = ind)) + geom_point() + 
  geom_line() + theme_bw() + facet_wrap(.~ind, nrow = 2) + 
  labs(x="", y="", color = "Time series")

Time series with ggplot

Тот же код, что и код, используемый ОП для временных рядов равной длины, работает нормально.

dm <- dist(xlist, method= "DTW")
hc <- hclust(dm, method="average")

plot(as.dendrogram(hc), hang = -1)
rect.hclust(hc, k = 2)

Dendrogram

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...