4-机器学习启蒙- 聚类和相似度模型

作者: 天涯明月笙 | 来源:发表于2018-02-13 19:35 被阅读240次

    4- 聚类和相似度模型

    聚类和相似度: 文档检索

    我们想从数据中推断出某种潜在的结构。
    结构是一组相关观测。对于一个实际应用进行研究。

    检索感兴趣的文档。

    文件检索

    目前正在阅读你喜欢的文章
    目标: 找出另一篇你可能感兴趣的文章

    一种能自动检测出他感兴趣文章的方法。

    面临的挑战

    • 我们如何衡量相似度
    • 如何在文章中进行搜索,找出下一篇它可能读的文章呢

    用于测量相似度的单词计数表示

    文档的单词计数表示

    词袋模型

    - 忽略单词的顺序
    

    把所有单词拿出来扔进这个口袋摇一摇,打乱了单词的顺序。

    - 对单词表中的每一个单词计数
    
    mark

    对于上面句子我们进行考虑。我们定义了一个向量。

    我们具有一个

    mark

    如上图所示的向量表。单词与他出现的次数共同构成了一个向量。

    这是一个稀疏向量。因为我们会有的单词只是其中的少数。

    度量文档的相似度

    mark

    假设对于这篇关于足球的文章。
    我们对于两个向量进行点乘。这样可以计算出大家都有的单词数值。

    只要对应位置一方为0,那么对应点乘这一项为0.

    1*3 + 5*2 = 13
    

    单词计数的问题 -文档长度

    mark

    我们文章的字数如果增加为原来的两倍。也就是将复制了一遍的文档加入其中进行比较

    那么我们的文档的相似度竟然变成52了。

    内容之间的联系其实没有变,但是文章变长之后,联系变得更深了。

    解决方法 归一化

    计算向量的范数

    mark

    计算出每一项向量值的数的平方的和。然后取其平方根。

    mark

    得到的归一化之后的向量如图所示。使得我们将不同文章的数量置于同等地位

    应用tf-idf 对于重要单词进行优先级排序

    上次的归一化处理,解决了我们的文档长度对于单词的影响。

    单词计数的问题 - 生僻字

    mark

    我们所说的常用词语指语料库中出现频率高的词。

    语料库:指我们在检索时查看的所有文档的总和。

    常用词决定了我们文档间相似度的度量。

    与之对应的是文档中的生僻词。

    常用单词会淹没生僻单词。

    什么是生僻词的特征?

    • 在语料库中看起来出现频率不高

    偏重于在少量文档中出现的单词

    • 同样的,通过他们在以下量值缩放单词w
      包含w的文档数量

    也就是包含w的文档越多,说明w越不重要。是一个常用词那么我们对它的次数进行缩放。

    也就是除以他在多少个文档出现了。

    关键词

    只有生僻词才最重要么?

    什么是关键词的特征?

    • 在文档中频繁出现(局部常见)
    • 在语料库中罕见出现(全局罕见)

    个人思考: 提取出主题,与主题相关的。

    关键词的特征就是 局部常见和全局罕见的平衡。

    Tf-idf 文档表示

    词频 逆向文档频率

    词频 考虑局部情况 某人正在阅读的文章。

    只是简单的统计该词出现的次数。

    通过逆向文档频率来减少出现在很多文档的词的权重。

    所以我们要考虑语料库中的所有文档:

    mark

    语料库中的文档数除以(1+包含单词的文档),再取商的对数。

    这个数对于一个太多频繁出现的单词,后面值约为1,取了对数就是0了。
    极大的减少在所有文档中都出现的单词的权重。直到极端情况0.

    与之相反的是如果我们有一个生僻词,我们将计算出一个非常大的数。

    一个非常的数,除以一个1+较小的数之商的对数。结果会较大。

    之所以数字1出现在公式的下方。是因为我们无法假设每个单词都会出现在语料库的文档中。避免除0错误。

    mark

    单词 the只在其中一篇文档没出现。所以单词the的权重完全减少到0.

    mark

    梅西这个单词出现在3篇文档中。此时它的逆向文档频率将会是4。

    简单的将两个向量相乘即可得到

    mark

    tf * idf

    常用词的权重减少了,而生僻词的权重增加了。

    检索相似的文档

    推荐文章

    最近邻域搜索

    查询文档: 正在阅读的文章。

    语料库: 搜索文章时我们拥有的文章的总和。

    为了实现最近的邻域搜索,我们需要定义一个距离

    指定: 距离度量
    输出: 最相似文档集合

    特例: 1- 最邻近

    输入: 查询文档
    输出: 最相似的一篇文章

    算法:
    - 在语料库中搜索每个文档
    - 计算 s = similarity(查询文档,语料库中某个文档)
    - if s > Best_s, record 最相似文档就是当前文档。设定Best_s = s
    当遍历完成之后,返回最优的推荐。

    K - 最邻近

    只需要将收集最终结果的best_s 换成一个列表。控制列表的len为k

    文档聚类

    对于相关联的文档进行聚类。

    不是所有的文章都已经被标记好了。我们只有一堆文章。我们想找到文章中的潜在分类方法。

    • 根据主题对文档分组
    • 发现相似文档的组
    mark

    如果一些标签已知会怎样?

    已知标签文档的训练集:

    mark

    这是一个多元分类问题

    mark

    如果是上面这样,这是一个监督学习的例子。

    聚类

    不提供标签
    想要发现集群结构

    输入; 作为向量的文档。

    我们假定这是一些只包含两个单词的文档。下图中横轴代表单词一数量,纵轴代表单词二数量。

    mark

    现实中的文档拥有很多单词,他们会在高维空间中分布。

    输出: 集群的标签

    mark

    个人思考: 中间的可以被打上多个标签

    事后人工回溯; 发现聚出来的类的真实标签。

    这是一个无监督学习任务,因为我们的任务不需要任何给定的标签。
    我们只使用到了观测量本身。

    什么定义了集群

    mark

    集群通过特定的集群中心和形状定义。

    把观测(文档 ) 分配给集群 (主题标签)

    • 把这个集群中的分数高于在其他聚类中的分数

    • 通常, 与本集群中心点比其他集群中心点更相似。

    • 鼠标所在位置的点因为更符合绿色集群向外扩张的形状。

    另一种方法可以只看观测点到集群中心的距离。

    K- 均值

    它只用到了和集群中心点的距离。

    假设: 相似性度量 = 与集群中心点的距离(越小越好)

    以最终将得到k个集群的假设出发:

    个人思考优化点; k的决定。

    会看每个集群的平均值,只考虑集群的中心。
    以此来将数据点分到不同的集群中。

    初始化算法

    很多方法来初始化集群中心的位置

    暂时假设我们会随机选出三个不同的集群中心。

    mark

    将观测分配给最近的中心点,判定的算法叫做沃罗诺伊向前算法

    圆圈是集群中心。

    由于初始的集群中心都是随机生成的。

    • 将集群中心修改为被分配给原中心点观测的均值。
    mark mark

    通过更新后的集群中心重新绘制。

    一直重复这个过程直到结果收敛。

    其他聚类例子

    • 图像搜索:
    mark

    聚类对于结构搜索颇有帮助

    • 通过病况来分组病人

    更好地表征疾病亚种和疾病

    举例来说我们可以锁定一组癫痫患者。

    mark

    癫痫发病的记录。

    • Amazon 中的商品

    从购买历史中发现未标定的商品类别。

    婴儿车人为的只加上了家具的标签。但是我们可以从购买历史中发现更好的标签可能是baby

    也可以发现用户群体,对于这些用户的定向产品推荐。

    • 组织网页搜索结果

    搜索的项可能有很多意思

    使用聚类组织输出结果。

    个人思考:遇到有明显多个聚类中心的,将输出结果聚类,提取关键词。

    • 发现相似的邻居

    • 估计一个小区域的价格。

    挑战:

    - 每个月对于每个区域只有很少的销售数据。
    

    解决方案:

    把有相似趋势的地区进行聚类然后在集群汇总共享信息。

    • 预测暴力犯罪以便更好的协调分配警力。

    开始编码实现。

    我们已经讨论了一个文档检索的任务。
    还讨论了一个聚类的概念用来揭示数据的潜在结构。
    还谈到了一些聚类这个概念有用武之地的领域。

    mark

    如上图所示是一个聚类算法的工作流程(与前几次的图不一样):

    • 训练数据是用来进行文档聚类的文档代号和文本表

    所以我们有一堆文档以及与他们对应的文本。

    • 我们将会提取一些特征量。我们前面提到了一些描绘一个文档的不同方法。
      • 本例子中我们用到一个tf-idf的方法
      • 中文名全称词频-逆文档频率法

    我们要通过这个表示方法对于我们的文档进行聚类。

    • 所以我们把这些特征量放入到一些机器学习的模型中。

    • 使用聚类模型,对于每个文档输出一个集群标签。

    输出量y帽子就是我们的集群标签,因为我们打算评估我们聚类结果的准确度。
    当然这里我们并没有真正的集群标签。因此还是将其称为预测或预估标签。

    我们并没有一个可以用来比对的真实标签,也就是上图中的y并不存在。因为我们的设定是无监督式学习。

    我们需要一种方法来评估我们的聚类准确度。我们准确度的度量方法也就是我们用来测量评估的是聚类的一致性。我们会测量每个观测点到他所在集群中心的距离,一个好的聚类算法中这些距离会很小。我们的目标是最小化这些距离。我们的准确度就是要测量这些距离,我们需要我们的原始数据,需要词频逆文档频率。所以那些值会从质量评估的右侧输入。然后我们还需要集群中心,所以这个w帽子也就是我们的当前估计值。是我们的模型参数。当然我们也需要用w帽子来测算距离。因此与其用真实标签评测准确度,不如用文档标识和集群中心。把原始数据输入到质量度量中用于计算到集群中心的距离(这是我们计算误差的度量,虽然它其实不是误差只是估计量)。我们的算法是k均值算法。

    k均值是在试着最小化观测点到集群中心的距离,或者说这些距离的总和。

    最小化的方式是通过不断的迭代循环,我们把w帽子不断更新成新的w帽子。用来表示观测点的新的质量中心,因此中心点会发生偏移。

    我们拿到原始数据使用某种方法进行表示,可以是单词统计量,可以是词频逆文档频率,或者是这些数据的标准化值。用二元,三元词组来表示我们的文件,然后我们的聚类算法(如kmeans可以输出集群标签),并且我们可以通过迭代来一次次的更新集群中心。也就是这个聚类模型的参数,迭代更新的依据是观测量到集群中心的距离。

    大家学到了

    详细的讲解了一些算法的背后细节。讨论了k均值算法和文件检索问题。相邻社区检索问题。并提供了解决问题的算法细节。尝试搭建一个新闻稿件检索系统。

    • 表示文档的描述方法
    • 度量两个文档中的相似性
    • 讨论关于应用单词计数的问题
      • 通过标准化计数来适应文档的长度
      • 通过tf-idf 来强调关键词
    • 描述聚类算法中的输入( 无标签预测)与输出(标签)

    判断一个任务是监督的还是非监督的。
    使用k-均值进行文档聚类。描述聚类的其他应用。

    实践编码

    见jupyter notebook

    相关文章

      网友评论

        本文标题:4-机器学习启蒙- 聚类和相似度模型

        本文链接:https://www.haomeiwen.com/subject/hbfstftx.html