[背景音乐] 翻译: RyukaSuu |审阅: 19waa Coursera Global Translator Community 我们在多种不同领域看到聚类的应用 作为一个示例 我们来看一些基于时间的数据 以及隐马尔克模型 回想一下我们之前遇到的聚类问题 在我们介绍过的方法里 数据点的索引 对于所有数据的聚类结果并不重要 也就是说 我们可以随意打乱我们数据点的次序 对打乱次序的数据做聚类 得到的结果和会之前的一样 但如果数据点词次序很重要的话 会怎样呢 比如时间序列 每个数据点关联一个时间戳 这会对数据分析有重要影响 比如 我们来看一个单变量的时间序列 观测点的值在y轴方向表示 观测点的时间戳在x轴方向表示 在这里 假设我们的目标是 把这个时间序列解析为 不同的所谓的动态状态 我们可以把它简单看做 数据集里的沿时间轴 的一种不同类型的聚类 有可能有一个绿色聚类 一个蓝色聚类 和一个红色聚类 并且时间序列在这几种 不同状态里切换 如果我们忽略跟每个数据点 关联着的时间戳 想象一下 就以这张图为例 沿x轴将这张图挤压 忽略时间戳 并且仅在 y轴方向上观察这些数据点 尝试对这些点进行聚类分析 将会非常困难 因为 绿色状态的时间序列 对应的取值 与蓝色状态和红色状态的 时间序列对应的取值 有非常多的重叠 因此所有的取值会有 非常多的重叠 如果没有大量的数据将会很难 分析出那里有三种不同的聚类 相反 这些关联时间戳的数据的结构 如这张图所示 可以帮助我们快速发现数据的 比较明显的模式 特别地 在这个数据集里 如果我们当前处在 绿色状态 看起来有很大可能性我们 会继续保持在绿色状态 或许还有其他的状态之间的切换 绿色蓝色的切换或者蓝色红色的切换 要比其他切换的可能性大 这种类型的信息可以帮助我们 从时间序列关联的数据中 提取到我们期望的聚类 所以在时间序列场景下 我们可以 把这个聚类分析看作是一个"划分"的任务 更具体一些 我们来看一个关于蜜蜂跳舞的分析 当一只蜜蜂在蜂窝里的时候 它在三种不同舞蹈动作里切换 为了和蜂窝里的其他蜂蜜交流 食物的地址 它在三种不同的舞蹈动作里切换 分别是 摆动 右转 以及左转 它一直不停重复这些舞蹈动作某种组合 以和其它蜜蜂交流 在这里 我们展示了 三种不同的舞蹈动作序列 这个序列被分割为"摆动" "右转" ”左转“三种舞蹈动作 分别用红色绿色和蓝色表示 但问题是 我们要想办法 自动提取这些信息 仅通过观察蜜蜂在蜂窝周围飞行时 身体的位置以及头部的角度 来提取这些信息 特别地 当我们观察这些舞蹈动作的时候 我们可以绘制一张 关于在某一时间片段内 对应何种舞蹈动作的图 从这张图里可以看出 某种舞蹈动作的持续性 以及各动作之间的转换 摆动 向左和向右 三种动作件的转换 从数据中我们可以发现 确实有某种模式 我们看到各种动作都有持续性 因为如果它当前在做某个舞蹈动作 它有很大可能会持续做这个动作 同时我们也发现某些动作切换 会比其它切换更频繁 比如 我当前处在红色舞蹈状态 有很大可能性我将切到绿色舞蹈状态 或者从绿色状态切到红色状态 尽管显然其它切换也有可能 这种类型的在各种不同动态状态 之间的切换形式 在很多应用里都会出现 幸运的时不仅仅在蜜蜂的研究中出现 例如我们有一段会议音频 如过参与会议的人轮流发言 我们希望能够把音频分段 使得每一段音频对应某个人发言 或许我们观察一个人在 做一组锻炼动作 我们希望能够区分出 这个人在做跳跃运动 跑步动作 或者下蹲动作 等等 通常 人们在做各种 不同的运动动作时 会在一系列的动作里不断切换 类似的 当我们 观察股票数据时 在考虑股票数据的时候 这确实是一种常用的方法 股票指数会在各种"波动频率"之间变化 有的时候股指会剧烈波动 有时会小幅波动 有时波动幅度在以上两者之间 很显然 确实有各种不同幅度的波动 所以 这种类型的结果在很多应用中都能碰到 我们来花一点时间 来介绍一个模型 这个模型可以让我们 从数据中提取这种 这个模型就是隐马尔科夫模型 简写为HMM HMM非常非常 近似于我们以前介绍的 混合模型 正如在混合模型里一样 每一个观测数据点都与 一个聚类相关联 在混合模型里我们用"聚类"这个名词 在隐马尔科夫模型里 我们常把 聚类称作某个"状态" 我们已经介绍了这些"动态状态" 所以 我们交替使用这两个名词 只是为了与我们之前介绍的混合模型 联系起来 好的 关键点是每一个观测数据点 都对应一个聚类 而且这个对应关系未知 我们多能看见的只有这些观测数据点 然后 正如我们在混合模型里一样 每一个聚类或者 状态对于观测数据点都有对应的分布 回想一下 在混合模型里 我们说每一类图片部分都有 基于图片蓝色分量值的高斯分布 如果我们分别基于白云图片 日落图片 和森林图片 考察这高斯分布 会发现这个几个高斯分布 并不相同 所以这就呈现出不同的聚类 在隐马尔科夫模型里 我们有不同的"动态状态" 对于每个数据点分配一个状态或这说聚类 那么对于某个状态内的观测数据 我们会有同样类型的分布 但是特别重要的不同点是 在隐马尔可夫模型里 某个观测数据点指定为某一聚类的概率 依赖于 这个观测数据点的 前面一个数据点属于哪个聚类 这就描述了我们将如何去捕捉时间依赖性 这就是我们如何去确定我们是否正处在 某一状态的方法 比如蜜蜂的摆动舞蹈动作 它很可能在下一个 时间片段内保持在这个动作状态里 再比如我们如果现在正处在 红色状态 我们很有可能 在下一个时间片段内转到绿色状态 然后有可能再转到蓝色状态 因此 通过沿着时间轴的聚类分配值 我们可以发现聚类的依赖结构 并且利用这个依赖结构我们可以提取到 具有时间依赖性的聚类 最后 HMM确实是 非常聪明的推断算法 它的基础是我们 以前介绍的混合模型 在混合模型的基础上 在聚类分配时增加了 时间依赖 例如 你可以用一个算法计算出 你的HMM参数 的最大似然估计 这个算法跟我们在混合模型里介绍的算法 非常相似 但在这个场景里 由于历史原因 这个算法被叫做Baum-Welch算法 这个算法分别在研究HMM的时候被发现 后来发现它与EM算法也有联系 你可以利用HMM做的另外一件事就是 在给定模型参数的条件下 计算最有可能的状态序列 模型的参数是固定的 你去找到最有可能的状态序列 或者聚类分配 为了完成这个任务 你可以使用Viterbi算法 Viterbi算法是动态规划的一个典型算法 可以高效地帮你找到这个状态序列 同意你也可以利用动态规划 去实现聚类的"软分配" 使用一个叫做"前向后向"算法 这些"软分配"在Baum-Welch算法里 发挥重要作用 如同在之前课程里介绍的 混合模型的标准的EM算法里 这个"软分配"也发挥重要作用 通过本节学习HMM 我们发现 我们在这个课程里学到的方法 确实为 学习其他重要的机器学习算法和方法 打下了稳固的基础 [背景音乐] 翻译: RyukaSuu |审阅: 19waa Coursera Global Translator Community