为什么对时间序列数据使用 K-Means 聚类?(第一部分)

导航至

作为一名独生子女,我有很多时间独自一人。通常,我摆脱独自一人的极度无聊的唯一解脱方式就是做白日梦。我会冥想我周围环境中的物体,并在我的脑海中旋转它们。我现在将我对拼图游戏、数学和艺术的热爱归因于我所有致力于视觉化练习的时间。我对这些事物的热爱激励我尝试更多地了解统计函数和 K-Means 聚类如何在时间序列数据的异常检测中使用。

时间序列聚类是一种无监督数据挖掘技术,用于根据数据点之间的相似性将数据点组织成组。其目标是最大化聚类内的数据相似性,并最小化聚类间的数据相似性。

在第一篇文章中,我将为以下问题提供高层次的答案

  1. 什么是 K-Means 聚类?
  2. 它如何用于时间序列数据?

如果您仍然有兴趣了解更多信息,请继续阅读第二篇文章。在那里,我将重点关注

  1. 一些展示如何使用 K-Means 的代码
  2. 为什么你不应该将 K-Means 用于上下文时间序列异常检测

为了有效地描述这些概念,我将分享大量的数学、图形可视化和艺术(用于大脑休息)。我希望它们有所帮助!

什么是 K-Means 聚类?

首先,我想对 K-means 聚类进行一般性概述。如果您熟悉 K-means,我建议跳到下一节。

机器学习系统分为 4 个主要类别,这些类别由它们在训练中接收到的人工监督量来定义。这些类别包括无监督学习、半监督学习、监督学习和强化学习。K-Means 聚类是一种无监督学习技术。换句话说,系统没有在人工监督下进行训练。相比之下,监督学习涉及将包含标签的训练数据馈送到您的机器学习算法中。

这是一个监督学习的简单示例。在下图中,我们有一系列颜色及其对应的红色/蓝色值。我们在我们的训练集中标记了每种颜色。

现在我们想知道这种新颜色是红色、蓝色还是紫色。我们可以使用 K-最近邻(一种监督学习算法)来预测它属于哪个颜色类别。K-最近邻 (KNN) 本质上是查看附近的所有其他点,通过其邻居的多数投票来确定我们颜色的类别。在这种情况下,我们神秘颜色的预测是紫色。

现在让我们看一下无监督学习的训练集。在这里,我们不为我们的数据分配标签。如果我们使用 K-Means 聚类,我们只需设置我们想要的聚类或类别的数量。在本例中,n_clusters = 3(红色、蓝色和紫色)。K-means 将生成三个点,质心,它们位于聚类的中心。现在,如果我们想知道一个新的红色/蓝色值属于什么颜色,我们可以简单地确定哪个质心最近,并将颜色分配给相应的类别。最好提一下,使用从质心到我们点的距离并不总是最好的主意。我将在下一篇文章中更详细地介绍这一点,以及 K-means 如何确定质心。剧透警告——两者都有一些严重的缺点。

它如何用于时间序列数据?

为什么人们将像 K-Means 聚类这样的无监督学习技术用于时间序列数据分析?为了回答这个问题,最好退后一步问,“我们为什么要将机器学习用于时间序列数据分析”?首先,正如“机器”和“学习”这两个词听起来多么诗意一样,最好记住,在许多情况下,机器学习并不是明智的解决方案。让我们假设……

……您认为一次性峰值是异常,并希望检测到它们。使用移动平均值周围的阈值可能是一个好主意。

<figcaption> 任何时候移动平均值超出阈值,我们都认为存在异常。</figcaption>

……您有紧密的数据、高度受控的系统或正态分布。基于标准差确定异常是明智的。

<figcaption> 太酷了!使用标准差使我能够跨多个时间序列数据找到异常。您只需将方差(偏差平方的平均值)相加,然后取其平方根即可找到标准差。标准差之外的任何点都可以被认为是异常。</figcaption>

……您的数据范围很广,并且您想检测到特定幅度的峰值。在这种情况下,您可能希望通过位于四分位距内的任何数据来定义非异常数据。

<figcaption> 如果您倾向于获得误报或突出显示风险行为,则此技术尤其好。想象一下,您在一个化工厂中,并且您正在监控来自压力表的管道压力。此压力传感器用于监控阀门的行为,该阀门不断打开和关闭以控制压力。您可能希望设置一个警报,告知工人在每次压力处于较高四分位范围时打开阀门并释放压力,以优先考虑安全性。</figcaption>

当您需要警惕数据中的细微变化时,事情会变得棘手。在这种情况下,统计函数可能无法帮助您。我们需要的是一些“理解”我们数据的外观,并可以帮助我们确定我们的数据是否偏离该规范的东西。我们可以使用上下文异常检测或集体异常检测。上下文异常是数据实例,用人类的术语来说,就是“不像自己”。异常行为是由正常系统本身定义的。如果我突然从座位上跳起来,像单人金属狂舞坑中的女人一样开始挥拳,我们会说这是一个上下文异常,因为我通常非常冷静。

当事件以意外的顺序发生时,就会发生集体异常。现在假设我决定不吃早餐、午餐和晚餐。我可能会变得“饿怒攻心”并变得暴躁。但是,在这种情况下,异常不是我生气。那对我来说很正常,当我没有吃饭时。相反,我应该监控我的喂食习惯,寻找其中的中断/异常,并预期我的系统会在检测到这些异常时崩溃。当数据集中的实例在顺序或空间上彼此相关时,就会发生集体异常。

<figcaption> 我建议阅读 异常检测:综述,以了解有关上下文异常和集体异常之间的区别以及检测它们的方法的更多信息。</figcaption>

要解决上下文异常检测问题,您应该使用机器学习。我们可以采用正常的时间序列数据集并对其应用 K-Means 聚类。这将使我们能够发现所有对我们的健康正常信号来说是独特的不同形状。然后,我们可以获取新数据,预测它属于哪个类别,并根据这些预测重建我们的数据集。最后,我们可以测量我们预测的信号和实际信号之间的误差,以确定是否存在异常。要查看实际操作,请阅读下一篇博客。否则,我希望这篇关于统计函数和 K-means 的介绍对您有所帮助。如果您发现任何令人困惑的地方或需要我的帮助,请随时告诉我。您可以访问 InfluxData 社区网站或在 Twitter 上 @InfluxDB 给我们发推文。

正如承诺的那样,这里有一些我创作的艺术作品。感谢 @Chris_Churilo 通过鼓励我分享我的爱好,在 InfluxData 培养创造力和开放性。