为什么在时间序列数据中使用K-Means聚类?(第一部分)
作者:Anais Dotis-Georgiou / 用例,开发者
2018年10月2日
导航至
作为独生子女,我花了很多时间独自一人。很多时候,我从孤独带来的极度无聊中解脱出来的唯一方式就是做白日梦。我会冥想周围的环境中的物体,并在脑海中旋转它们。我现在认为我对拼图、数学和艺术的热爱都归功于我投入的大量可视化练习时间。我对这些事物的热爱激发了我去尝试了解更多关于统计函数和K-Means聚类在时间序列数据异常检测中的应用。
时间序列聚类是一种无监督数据挖掘技术,它根据数据的相似性将数据点组织成组。目标是最大化聚类内的数据相似性,最小化聚类间的数据相似性。
在这篇第一篇文章中,我针对以下问题提供了一些高层次答案
- 什么是K-Means聚类?
- 它是如何用于时间序列数据的?
如果您仍然想了解更多,请继续阅读第二篇文章。在那里,我将重点介绍
- 一些代码示例,展示如何使用K-Means
- 为什么您不应该使用K-Means进行上下文时间序列异常检测
为了有效地描述这些概念,我将分享大量的数学知识、图形可视化以及艺术(用于大脑休息)。希望它们能有所帮助!
什么是K-Means聚类?
首先,我想对K-means聚类进行一个概述。如果您熟悉K-means,建议您跳到下一部分。
机器学习系统根据它们在训练过程中接收到的监督程度分为四大类。这些类别包括无监督学习、半监督学习、监督学习和强化学习。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的社区网站或发推文给我们@InfluxDB。
正如承诺的那样,这是我制作的一些艺术作品。向@Chris_Churilo致敬,他通过鼓励我分享我的爱好,在InfluxData中培养创造力和开放性。