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)
但是我想找到一种聚类方法,根据趋势为每一行分配一个聚类,因此第1,2和3行属于一个聚类,而第4和第5行属于另一个聚类。
答案 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)
我没有定义新的距离指标,而是通过转换数据实现了基本相同的功能。首先缩放每一行,以便我们可以比较相对趋势,而不会在规模上产生差异。接下来,我们只是将数据转换为差异。
警告:不必须适用于所有“趋势”数据。特别是,观察连续的差异只能捕获“趋势”的单个有限方面。您可能需要考虑更复杂的指标。
答案 1 :(得分:2)
执行更多预处理。对于任何数据挖掘,预处理都是90%的努力。
例如,如果您想按趋势进行聚类,那么您可能应该将聚类应用于趋势,而不是原始值。因此,例如,将曲线标准化为平均值0和标准偏差1.然后计算从一个值到下一个值的差异,然后将聚类应用于此预处理数据!
答案 2 :(得分: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