R中的圆柱形聚类 - 将时间戳与其他数据进行聚类。

3
我正在学习R语言,需要对带有时间戳字段的数字数据进行聚类。其中一个参数是时间,由于数据严格依赖于白天和黑夜,我想考虑到这些数据的“球形”特性。
从手册中了解到,如skmeans等库无法处理“圆柱形”数据,只能处理“球形”数据(即所有组件都在极坐标系中)。
针对这个问题,我的解决方案是:将小时列(0-24)分解为两个不同的列X和Y,并将时间表达为极坐标,例如x^2+y^2=1。这样,使用欧几里得距离的k-means应该可以正确解释数据。
我的想法正确吗?

你解决了吗?它起作用了吗? - wolfsatthedoor
是的,对于我的需求来说还不错 :) - asdf
2个回答

3
这里是小时(包括小时和部分小时)到分钟的映射。我们尝试使用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

是的,谢谢!我知道如何做,但我不确定这是否是一个好主意。但我想这是我能得到的最好的结果。(而且它正在运行,所以我有了这个,这很好) - asdf
那么现在每个一维点都必须用两个维度来表示了吗?如果我们已经有两个循环时间维度,比如一周中的某一天和一天中的某个小时,那该怎么办? - wolfsatthedoor

2

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

但是,将数据投影到有意义的欧几里得空间中是避免这种问题的简单方法。

然而,请注意,您的平均值将不再位于圆柱体上。在许多情况下,您可以将平均值缩放到所需的圆柱体上。但如果成为0,则无法进行有意义的重新缩放。

另一个选择是核k-means。由于在数据转换后,您所需的距离是欧几里得距离,因此您也可以对这种转换进行“核化”,并使用核k-means。但是,在您的特定情况下,转换数据可能实际上更快。当使用更复杂的转换时(例如,转换到无限维向量空间),它很可能只会得到回报。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接