2016-11-19 64 views
0

假设,我必须对应于5个类别个连续程序10天每小时数据群集成员关系,创建为:统计上几天

library(xts) 
set.seed(123) 
timestamp <- seq(as.POSIXct("2016-10-01"),as.POSIXct("2016-10-10 23:59:59"), by = "hour") 
data <- data.frame(cat1 = rnorm(length(timestamp),150,5), 
         cat2 = rnorm(length(timestamp),130,3), 
         cat3 = rnorm(length(timestamp),150,5), 
         cat4 = rnorm(length(timestamp),100,8), 
         cat5 = rnorm(length(timestamp),200,15)) 
data_obj <- xts(data,timestamp) # creat time-series object 
head(data_obj,2) 

现在,每天我单独进行集群,看看这些类别相对于彼此表现使用简单kmeans为:

daywise_data <- split.xts(data_obj,f="days",k=1) # split data day wise 
clus_obj <- lapply(daywise_data, function(x){ # clustering day wise 
    return (kmeans(t(x), 2)) 
}) 

一旦集群是结束了,我可视化在不同的10天群集关系与

sapply(clus_obj,function(x) x$cluster) # clustering results 

,我发现结果

enter image description here

目测,很显然,cat1cat3始终保持相同的群集。类似地,cat4cat5在10个不同的日子里大多在不同的群中。

除了目视检查,是否有任何自动的方法来收集这种类型的统计从这样的聚类表


注意:这是一个虚拟的例子。我有一个包含连续100天80个类别的数据框。像上面这样的自动总结会减少工作量。

回答

0

配对计数群集评估措施显示了解决此问题的简单方法。

这些方法不是查看不稳定的对象集群分配,而是查看两个对象是否在同一个集群中(称为“对”)。

所以你可以检查这些对是否随时间变化很大。由于k-means是随机化的,你可能还想在每个时间片上运行几次,因为它们可能会返回不同的聚类!

然后你可以说例如系列1在90%的结果中与系列2处于同一簇中。等等。

+0

你的解释是正确的,我想计算这个百分比。但是[维基百科](https://en.wikipedia.org/wiki/Cluster_analysis)中提到的外部评估指标似乎并不适用于我的案例,因为我没有基本事实(基准)。这个聚类是无监督的。您的进一步见解可能会帮助我进一步挖掘... –

+0

同样的方法可用于比较两个不同时间点的结果。大多数这些方法是对称的,基本上它们是分区的相似性度量。 –

+0

我改写了一下我的问题,并在[this]得到了答案(http://stackoverflow.com/q/40713096/3317829)堆栈溢出链接 –