6

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) 

通过 clara() 进行聚类

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

4

3 回答 3

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) 

在此处输入图像描述

我没有定义新的距离度量,而是通过转换数据完成了基本相同的事情。首先缩放每一行,以便我们可以比较相对趋势,而不会因规模差异而让我们失望。接下来,我们只是将数据转换为差异。

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

于 2012-05-11T17:25:56.793 回答
2

做更多的预处理。对于任何数据挖掘,预处理是 90% 的工作量。

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

于 2012-05-11T18:37:50.383 回答
1

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

然后使用任何聚类算法(如 kmeans/层次聚类)来聚类相似的趋势。

代码

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 
于 2019-02-04T07:54:45.167 回答