R - 聚类时间戳与其他数据的圆柱聚类

时间:2014-08-08 23:08:56

标签: r cluster-analysis k-means

我正在学习R,我必须使用时间戳字段对数字数据进行聚类。 其中一个参数是时间,由于数据严格依赖于昼夜,我想考虑一下"球形"这个数据的性质。

就我从手册中看到的那样,像 skmeans 这样的库无法处理"圆柱形"数据,但只有"球形"数据(即所有组件都在极坐标中)。

我对合适解决方案的想法如下:我可以将HOUR列(0-24)分解为两个不同的列X,Y并以极坐标表示时间,例如x ^ 2 + y ^ 2 = 1 。 通过这种方式,具有欧氏距离的k均值不应该有解释数据的问题。

我是对的吗?

2 个答案:

答案 0 :(得分:3)

以下是hm的映射,其中h是以小时为单位的时间(以及小时的一小部分)。然后我们尝试kmeans,至少在这个测试中它似乎有效:

h <- c(22, 23, 0, 1, 2, 10, 11, 12)
ha <- 2*pi*h/24
m <- cbind(x = sin(ha), y = cos(ha))

kmeans(m, 2)$cluster # compute cluster assignments via kmeans
## [1] 2 2 2 2 2 1 1 1

答案 1 :(得分:2)

k-means应该使用平方欧几里德距离。

但事实上:将数据投射到有意义的欧几里德空间是避免此类问题的简单方法。

然而请注意,你的意思将不再躺在气缸上。在许多情况下,您可以将平均值缩放到所需的圆柱体。但它可能会变为0,那么就不可能进行有意义的重新缩放。

另一个选项是内核k-means 。由于您在数据转换后所需的距离是欧几里得,您还可以&#34;核化&#34;这个转换,并使用内核k-means。但在特定情况下转换数据实际上可能会更快。它可能只会在使用更复杂的变换时(例如,无限维向量空间)得到回报。