聚类日期列表
Posted
技术标签:
【中文标题】聚类日期列表【英文标题】:Clustering a list of dates 【发布时间】:2014-05-07 07:13:11 【问题描述】:我有一个日期列表,我想将它们分成 3 个集群。现在,我可以看到我应该查看 k-means 的提示,但到目前为止我发现的所有示例都与坐标有关,换句话说,是成对的列表项。
我想获取这个日期列表并将它们附加到三个单独的列表中,表明它们是在某个事件之前、期间还是之后。我没有时间参加这个活动,但这就是为什么我将日期/时间分成三组来猜测它的原因。
谁能帮忙举一个简单的例子,说明如何使用 numpy 或 scipy 之类的东西来做到这一点?
【问题讨论】:
为什么不直接对列表进行排序并选择两个时间点作为拆分?如果您正在考虑集群,您是否希望时间在您正在寻找的事件附近“聚集”?在那种情况下,为什么不把最密集的时间作为你的活动时间呢? @chthonicdaemon 为这个问题喝彩。我怀疑时代应该被“捆绑”成三组。这些是手术中拍的照片,所以他们应该在开始之前拍一些照片,然后在过程中然后在之后,所以时间之间应该有两个自然的差距。我试图将这些时间分成三组。 【参考方案1】:k-means 仅用于坐标。更准确地说:用于连续和线性值。
原因是 mean 函数。许多人忽略了 mean 对于 k-means 的作用(尽管它在名称中......)
在非数值数据上,你如何计算平均值?
存在一些二进制或分类数据的变体。例如,IIRC 有 k-modes,还有 k-medoids(PAM,围绕 medoids 分区)。
我不清楚你想要整体实现什么......你的数据似乎是一维的,所以你可能想看看这里关于一维数据的许多问题(因为数据可以排序,它可以比多维数据更有效地处理)。
一般来说,即使您将数据投影到 unix 时间(自 1.1.1970 以来的秒数),k-means 也可能只会为您返回平庸的结果。原因是它会尽量让三个区间的长度相同。
您有任何理由怀疑“之前”、“期间”和“之后”的持续时间相同吗?如果不是,请不要使用 k-means。
不过,您可能想看看 KDE;并绘制估计的密度。一旦你了解了密度对你的任务的作用,你就可以开始寻找合适的算法(例如,对你的密度估计求导,寻找最大的增加/减少,或者估计一个“平均”水平,然后寻找高于平均水平的最长间隔)。
【讨论】:
【参考方案2】:以下是一些解决方法,它们可能不是最佳答案,但应该会有所帮助。
您可以将日期绘制为从开始日期(例如一周)转换的持续时间 并将日期转换为从起点开始以分钟或小时为单位的时间数字表示。
这些都将沿 x 轴绘制,但 Kmeans 应该仍然可行,并且聚类在图表上仍然可见。
这里有更多numpy的例子:Python k-means algorithm
【讨论】:
我不认为我完全理解,但我已经更加充实了这个问题。从示例中我只能看到对的使用,但我不确定如何只使用单个列表项。似乎 k-means 仅用于坐标。 我想你会为 3 个质心或集群定义 K=3。您很可能必须想出一种将日期/时间转换为数字格式的方法,例如: double date = Convert.ToSingle(DateTime.Now.ToOADate()); [您的 y 轴可以是一天中的时间或条目数],然后使用类似于此处的 Kmeans 算法:codeding.com/articles/k-means-algorithm 这有意义吗?我认为您需要使用 x,y 坐标作为 kmeans 的工作日期,因为它通常将点聚集在一个组中,并且需要进行大修才能以不同的方式操作。 对于 x 和 y:double x = Convert.ToSingle(DateTime.Now.ToOADate());双 y = 日期条目数 为@amanda fouts 的信息干杯。我稍微调整了你的建议,它符合我的目的。我只是将日期精确到秒,然后将它们加倍,就好像它们是坐标并使用了 k-means。然后,使用结果,我刚刚从代表我的假坐标的两个值列表中提取了第一个值,并用它来进一步处理。这有点作弊,但它有效,我会使用它。 K-means 似乎是我唯一可以使用的方法,它允许我指定我想要的集群数量。以上是关于聚类日期列表的主要内容,如果未能解决你的问题,请参考以下文章