当前位置: 首页 > news >正文

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

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

相关文章:

  • 1.2—Spring项目快速搭建—2.基于Spring Tool Suite搭建
  • “box-shadow”属性(转)
  • SQL Server 使用 Pivot 和 UnPivot 实现行列转换
  • 博通孔海泉:一个完全无线连接的市场要解决4个问题
  • CCF NOI1048 检测矩阵
  • IndexedDB
  • pl/sql 笔记之存储过程、函数、包、触发器(下)
  • mysql的库和表相关操作
  • Exchange 2010升级sp2报错
  • 【Cocosd2d-x CCMenu菜单之二】
  • ISO8583开发注意事项和心得体会
  • iOS 相册和网络图片的存取
  • beanshell获取响应结果数据
  • XYGame-网络同步3-防作弊
  • 红黑树 - C++代码实现
  • codis proxy处理流程
  • gops —— Go 程序诊断分析工具
  • javascript 总结(常用工具类的封装)
  • jQuery(一)
  • Linux各目录及每个目录的详细介绍
  • Nacos系列:Nacos的Java SDK使用
  • SQL 难点解决:记录的引用
  • SQLServer插入数据
  • 不上全站https的网站你们就等着被恶心死吧
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 大型网站性能监测、分析与优化常见问题QA
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 京东美团研发面经
  • 每天10道Java面试题,跟我走,offer有!
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端临床手札——文件上传
  • 前端知识点整理(待续)
  • 日剧·日综资源集合(建议收藏)
  • 算法-插入排序
  • 字符串匹配基础上
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 交换综合实验一
  • ![CDATA[ ]] 是什么东东
  • (12)Linux 常见的三种进程状态
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)jQuery 基础
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net 按比例显示图片的缩略图
  • .NET 中创建支持集合初始化器的类型
  • .Net中ListT 泛型转成DataTable、DataSet
  • .net中我喜欢的两种验证码
  • .pyc文件是什么?