如何按趋势而不是R中的距离进行聚类?

时间:2012-05-11 17:13:57

标签: r cluster-analysis

clara()函数中的k-medoids使用距离来形成簇,所以我得到了这种模式:

a <- matrix(c(0,1,3,2,0,.32,1,.5,0,.35,1.2,.4,.5,.3,.2,.1,.5,.2,0,-.1), byrow=T, nrow=5)
cl <- clara(a,2)
matplot(t(a),type="b", pch=20, col=cl$clustering) 

clustering by clara()

但是我想找到一种聚类方法,根据趋势为每一行分配一个聚类,因此第1,2和3行属于一个聚类,而第4和第5行属于另一个聚类。

3 个答案:

答案 0 :(得分:5)

这个问题可能更适合stats.stackexchange.com,但无论如何这里都是一个解决方案。

您的问题实际上是“如何选择正确的距离指标?”。您需要一个距离来衡量趋势中的相似性,而不是这些向量之间的欧几里德距离。

这是一个选项:

a1 <- t(apply(a,1,scale))
a2 <- t(apply(a1,1,diff))

cl <- clara(a2,2)
matplot(t(a),type="b", pch=20, col=cl$clustering) 

enter image description here

我没有定义新的距离指标,而是通过转换数据实现了基本相同的功能。首先缩放每一行,以便我们可以比较相对趋势,而不会在规模上产生差异。接下来,我们只是将数据转换为差异。

警告:必须适用于所有“趋势”数据。特别是,观察连续的差异只能捕获“趋势”的单个有限方面。您可能需要考虑更复杂的指标。

答案 1 :(得分:2)

执行更多预处理。对于任何数据挖掘,预处理都是90%的努力。

例如,如果您想按趋势进行聚类,那么您可能应该将聚类应用于趋势,而不是原始值。因此,例如,将曲线标准化为平均值0和标准偏差1.然后计算从一个值到下一个值的差异,然后将聚类应用于此预处理数据!

答案 2 :(得分:1)

您可以使用k means聚类算法,但是在此之前,我建议您创建一个N* N矩阵,其中每个元素代表一个趋势与另一个趋势的相关性得分。

然后使用任何聚类算法(如kmeans /分层聚类)对相似趋势进行聚类。

R代码

a <- matrix(c(0,1,3,2,0,.32,1,.5,0,.35,1.2,.4,.5,.3,.2,.1,.5,.2,0,-.1),byrow=T, nrow=5)

library(TSclust)

library(reshape2)

Tech1 <- diss(a,"COR")       # Correlation
Tech2 <- diss(a,"EUC")       # Euclidean Distance
Tech3 <- diss(a, "DTW")      # Dynamic Time Wrapping

clust1 <- kmeans(Tech1, 3)
clust1 <- kmeans(Tech2, 3)
clust1 <- kmeans(Tech3, 3)

clust1$cluster
>> 1 2 3 4 5 
>> 1 2 2 3 3 

clust2$cluster
>> 1 2 3 4 5 
>> 1 2 2 3 3

clust3$cluster
>> 1 2 3 4 5 
>> 3 2 2 1 1