Có thể thực hiện phân cụm chuỗi thời gian dựa trên hình dạng đường cong?


47

Tôi có dữ liệu bán hàng cho một loạt các cửa hàng và muốn phân loại chúng dựa trên hình dạng đường cong của chúng theo thời gian. Dữ liệu trông gần giống như thế này (nhưng rõ ràng không phải là ngẫu nhiên và có một số dữ liệu bị thiếu):

n.quarters <- 100
n.stores <- 20
if (exists("test.data")){
  rm(test.data)
}
for (i in 1:n.stores){
  interval <- runif(1, 1, 200)
  new.df <- data.frame(              
    var0 = interval + c(0, cumsum(runif(49, -5, 5))),
    date = seq.Date(as.Date("1990-03-30"), by="3 month", length.out=n.quarters),
    store = rep(paste("Store", i, sep=""), n.quarters))
  if (exists("test.data")){
    test.data <- rbind(test.data, new.df)    
  } else {
    test.data <- new.df
  }
}
test.data$store <- factor(test.data$store)

Tôi muốn biết làm thế nào tôi có thể co cụm dựa trên hình dạng của các đường cong trong R. Tôi đã xem xét phương pháp sau:

  1. Tạo một cột mới bằng cách chuyển đổi tuyến tính var0 của mỗi cửa hàng thành giá trị trong khoảng từ 0,0 đến 1,0 cho toàn bộ chuỗi thời gian.
  2. Phân cụm các đường cong biến đổi này bằng cách sử dụng kmlgói trong R.

Tôi có hai câu hỏi:

  1. Đây có phải là một cách tiếp cận thăm dò hợp lý?
  2. Làm cách nào tôi có thể chuyển đổi dữ liệu của mình sang định dạng dữ liệu theo chiều dọc kmlsẽ hiểu? Bất kỳ đoạn R sẽ được đánh giá cao!

2
bạn có thể nhận được một vài ý tưởng từ một câu hỏi trước đó về việc phân cụm các quỹ đạo dữ liệu theo chiều dọc riêng lẻ.stackexchange.com/questions/2777/ trên
Jeromy Anglim

1
@Jeromy Anglin Cảm ơn các liên kết. Bạn đã có may mắn với kml?
đánh dấu

Tôi đã có một cái nhìn nhanh, nhưng hiện tại tôi đang sử dụng phân tích cụm tùy chỉnh dựa trên các tính năng được chọn của chuỗi thời gian riêng lẻ (ví dụ: trung bình, ban đầu, cuối cùng, thay đổi, sự hiện diện của những thay đổi đột ngột, v.v.).
Jeromy Anglim

Đây có phải là một bản sao? stats.stackexchange.com/questions/3238/ Mạnh
Rob Hyndman

@Rob Câu hỏi này dường như không giả định khoảng thời gian bất thường, nhưng thực sự chúng gần nhau (tôi không nhắc về câu hỏi khác tại thời điểm viết bài của tôi).
chl

Câu trả lời:


26

Một số hướng để phân tích dữ liệu theo chiều dọc đã được thảo luận trong liên kết được cung cấp bởi @Jeromy, vì vậy tôi sẽ đề nghị bạn đọc chúng cẩn thận, đặc biệt là các hướng dẫn về phân tích dữ liệu chức năng. Hãy thử googling cho "Clustering chức năng của Longitudinal dữ liệu", hoặc hộp công cụ PACE Matlab mà là có liên quan đặc biệt với clustering dựa trên mô hình của quỹ đạo bất thường lấy mẫu (Peng và Müller, Khỏang cách dựa trên phân nhóm của các quá trình ngẫu nhiên thưa thớt quan sát, với các ứng dụng để đấu giá trực tuyến , Biên niên sử thống kê ứng dụng 2008 2: 1056). Tôi có thể tưởng tượng rằng có thể có một khung thống kê tốt cho chuỗi thời gian tài chính, nhưng tôi không biết về điều đó.

kmltniyi=(yi1,yi2,,yit)d(yi,yj)=t1k=1t(yikyjk)2. Dữ liệu bị thiếu được xử lý thông qua một sửa đổi nhỏ của thước đo khoảng cách trước đó (điều chỉnh Gower) liên quan đến sơ đồ cắt ngang giống hàng xóm gần nhất (để tính toán tiêu chí Calinski). Vì tôi không thể hiện bản thân mình dữ liệu thực của bạn sẽ như thế nào, tôi không thể nói nếu nó sẽ hoạt động. Ít nhất, nó hoạt động với các đường cong tăng trưởng theo chiều dọc, hình dạng "đa thức", nhưng tôi nghi ngờ nó sẽ cho phép bạn phát hiện các mẫu rất cụ thể (như cực tiểu / cực đại cục bộ tại các điểm thời gian cụ thể với các điểm thời gian khác nhau giữa các cụm, bởi một bản dịch cho thí dụ). Nếu bạn quan tâm đến việc phân cụm các đường cong có thể bị sai lệch, thì bạn chắc chắn phải xem xét các giải pháp khác; Phân cụm chức năng và căn chỉnh , từ Sangalli và cộng sự, và các tài liệu tham khảo trong đó có thể cung cấp một điểm khởi đầu tốt.

kmlclusterizLongDataidt

library(lattice)
xyplot(var0 ~ date, data=test.data, groups=store, type=c("l","g"))

tw <- reshape(test.data, timevar="date", idvar="store", direction="wide")
parallel(tw[,-1], horizontal.axis=F, 
         scales=list(x=list(rot=45, 
                            at=seq(1,ncol(tw)-1,by=2), 
                            labels=substr(names(tw[,-1])[seq(1,ncol(tw)-1,by=2)],6,100), 
                            cex=.5)))

library(kml)
names(tw) <- c("id", paste("t", 1:(ncol(tw)-1)))
tw.cld <- as.cld(tw)
cld.res <- kml(tw.cld,nbRedrawing=5)
plot(tw.cld)

Hai hình tiếp theo là dữ liệu mô phỏng thô và giải pháp năm cụm (theo tiêu chí Calinski, cũng được sử dụng trong gói fpc ). Tôi không hiển thị phiên bản thu nhỏ .

văn bản thay thế

văn bản thay thế


1
Cảm ơn câu trả lời rất chi tiết của bạn. Tôi đã kmlchạy trên dữ liệu của mình, nhưng như bạn đề xuất, nó chủ yếu phân cụm dựa trên cường độ chứ không phải hình dạng đường cong, vì vậy tôi đang thử một vài bước xử lý trước để xem liệu tôi có thể cải thiện vấn đề không. Công trình của Sangalli et al. có vẻ rất hứa hẹn cho những gì tôi muốn làm - tuy nhiên tôi không thể tìm thấy cách thực hiện phương pháp của họ. Tôi có lẽ không có thời gian để tự mình thực hiện công việc của họ cho dự án này. Bạn có biết về bất kỳ triển khai FOSS nào không?
đánh dấu

@fmark Không có triển khai OSS theo hiểu biết của tôi (công việc khá gần đây); họ sử dụng k-mean và k-medoid, cả hai đều có sẵn trong R. Theo tôi, phần quan trọng nhất là tạo các đường cong mẫu và thực hiện chức năng cong vênh. Vì thế, bạn có thể tìm thấy các infos bổ sung bằng cách xem xét phân tích hình thái / procruste hoặc tra cứu mã của hộp công cụ Matlab PACE (nhưng cái này phải có đầy đủ EM hoặc những thứ tương tự). Đề nghị tốt nhất của tôi sẽ là: Yêu cầu tác giả cho bất kỳ miễn phí thực hiện thuật toán của họ.
chl

2
Tôi sẽ báo cáo lại nếu tôi nhận được một lời khẳng định :) Căn chỉnh k-mean giấy của họ để phân cụm đường cong có thêm một số chi tiết triển khai cũng có thể hữu ích cho ai đó muốn tự làm điều này.
đánh dấu

1
Tại sao không chỉ loại bỏ giá trị trung bình (và có thể chia cho độ lệch chuẩn), và sau đó làm điều này? Sau đó, kết quả sẽ có nhiều hơn về hình dạng, và ít hơn về độ lớn ...
ness101

9

Một cách tiếp cận khác đã được công bố bởi thống kê. Thông thường ở Wang, Xiaozhe, Kate Smith và Rob Hyndman.

'Phân cụm dựa trên đặc tính cho dữ liệu chuỗi thời gian'. Khai thác dữ liệu và khám phá kiến ​​thức 13, không. 3 (2006): 335 Hàng364 .

Họ viết:

Bài viết này đề xuất một phương pháp để phân cụm chuỗi thời gian dựa trên các đặc điểm cấu trúc của chúng. Không giống như các lựa chọn thay thế khác, phương pháp này không phân cụm các giá trị điểm bằng cách sử dụng thước đo khoảng cách, thay vào đó, cụm này dựa trên các tính năng toàn cầu được trích xuất từ ​​chuỗi thời gian. Các biện pháp tính năng được lấy từ mỗi loạt riêng lẻ và có thể được đưa vào các thuật toán phân cụm tùy ý, bao gồm thuật toán mạng thần kinh không giám sát, bản đồ tự tổ chức hoặc thuật toán phân cụm. Các biện pháp toàn cầu mô tả chuỗi thời gian thu được bằng cách áp dụng các hoạt động thống kê nắm bắt tốt nhất các đặc điểm cơ bản: xu hướng, tính thời vụ, tính định kỳ, tương quan nối tiếp, độ lệch, nhiễu loạn, hỗn loạn, phi tuyến tính và tự tương tự. Vì các cụm phương thức sử dụng các biện pháp toàn cầu được trích xuất, nó làm giảm tính chiều của chuỗi thời gian và ít nhạy cảm hơn với dữ liệu bị thiếu hoặc nhiễu. Chúng tôi tiếp tục cung cấp một cơ chế tìm kiếm để tìm ra lựa chọn tốt nhất từ ​​bộ tính năng nên được sử dụng làm đầu vào phân cụm.

Mã R có sẵn trên blog của Rob .


6

Bạn có thể nhìn vào công việc của Eamonn Keogh (UC Riverside) về phân cụm chuỗi thời gian. Trang web của anh ấy có rất nhiều tài nguyên. Tôi nghĩ rằng anh ta cung cấp các mẫu mã Matlab, vì vậy bạn phải dịch nó sang R.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.