是否可以根据曲线形状进行时间序列聚类?

机器算法验证 r 时间序列 聚类
2022-02-05 07:14:20

我有一系列网点的销售数据,并希望根据它们随时间变化的曲线形状对它们进行分类。数据大致如下(但显然不是随机的,并且有一些缺失数据):

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)

我想知道如何根据 R 中曲线的形状进行聚类。我考虑了以下方法:

  1. 通过将每个商店的 var0 线性转换为整个时间序列的 0.0 到 1.0 之间的值来创建一个新列。
  2. 使用R中的kml对这些变换曲线进行聚类。

我有两个问题:

  1. 这是一种合理的探索方法吗?
  2. 如何将我的数据转换为kml可以理解的纵向数据格式?任何 R 片段将不胜感激!
3个回答

@Jeromy 提供的链接中讨论了分析纵向数据的几个方向,因此我建议您仔细阅读它们,尤其是那些关于功能数据分析的方向。尝试使用谷歌搜索“纵向数据的功能聚类”,或专门关注基于模型的不规则采样轨迹聚类的 PACE Matlab 工具箱(Peng 和 Müller,基于距离的稀疏观察随机过程聚类,并应用于在线拍卖应用统计年鉴2008 2:1056)。我可以想象金融时间序列可能有一个很好的统计框架,但我不知道。

kml软件包基本上依赖于 k-means,(默认情况下)在个体个测量值之间的欧几里德距离上工作。所谓的轨迹只是个体的一系列观测值,tniyi=(yi1,yi2,,yit)d(yi,yj)=t1k=1t(yikyjk)2. 通过对与最近邻式插补方案(用于计算 Calinski 标准)相关的先前距离测量(Gower 调整)进行轻微修改来处理丢失的数据。因为我不代表自己真实数据的样子,所以我不能说它是否会起作用。至少,它适用于纵向增长曲线,“多项式”形状,但我怀疑它是否允许您检测非常具体的模式(例如特定时间点的局部最小值/最大值,集群之间的时间点不同,通过翻译例子)。如果您对聚类可能未对齐的曲线感兴趣,那么您肯定需要查看其他解决方案;功能聚类和对齐,来自 Sangalli 等人,以及其中的参考文献可以提供一个很好的起点。

下面,我向您展示一些可能有助于试验它的代码(如果您想重现结果,我的种子通常设置为 101)。基本上,使用kml你只需要构造一个clusterizLongData对象(id第一列的数字,下一列中t

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)

接下来的两个图是原始模拟数据和五簇解决方案(根据 Calinski 标准,也用于fpc包)。我不显示缩放版本

替代文字

替代文字

stats.se 的常客 Wang、Xiaozhe、Kate Smith 和 Rob Hyndman 发表了另一种方法。

“时间序列数据的基于特征的聚类”。数据挖掘和知识发现 13,没有。3 (2006): 335–364

他们写:

本文提出了一种基于时间序列结构特征的聚类方法。与其他替代方法不同,此方法不使用距离度量对点值进行聚类,而是根据从时间序列中提取的全局特征进行聚类。特征度量是从每个单独的系列中获得的,并且可以输入到任意聚类算法中,包括无监督神经网络算法、自组织图或层次聚类算法。描述时间序列的全局度量是通过应用最能捕捉基本特征的统计操作获得的:趋势、季节性、周期性、序列相关性、偏度、峰度、混沌、非线性和自相似性。由于该方法使用提取的全局度量进行聚类,它降低了时间序列的维数,并且对丢失或嘈杂的数据不太敏感。我们进一步提供了一种搜索机制,以从应该用作聚类输入的特征集中找到最佳选择。

R 代码可在Rob 的博客上找到。

您可以查看Eamonn Keogh(加州大学河滨分校)关于时间序列聚类的工作。他的网站有很多资源。我认为他提供了 Matlab 代码示例,因此您必须将其翻译为 R。