机器学习算法,聚类和相似度(相似文档推荐案例)

聚类和相似度

1、[找到一种自动索引检索他感兴趣文章的方法]

  • 1、如何衡量文章之间的相似度(需要一种度量手段)
  • 2、怎样在全部的文章中搜索出下一篇要推荐的文章

2、如何表示一篇文档

  • 词袋模型(忽略文档中单词的顺序信息)仅仅计算每个单词在文档中出现次数
  • 如何表示:用一个向量,定义词汇表(单词索引,单词统计向量)

3、如何度量一篇文档的相似度

  • 将两篇文档的单词统计向量 进行点乘(对应位置相乘再加和)
  • 问题所在:如果两倍长的文章,则对应相似度就是原来四倍,显然不符合模型目的要求
  • 解决办法:归一化这个向量:计算向量的范数(计算向量中元素的平方的综合,然后取平方根)可以将不同长度的文章,置于平等地位,然后检索中使用归一化的向量

4、文档中的关键词

  • 关键词 文章中出现频率很高又和文章相关的单词(局部常见)(全局罕见):在词语库中又不太常见的
    即权衡局部常见率和全局罕见率
  • 生僻词 在词语库不常见的,但对一篇文章很重要
  • 常见词 the is…

5、TF-IDF方法:权衡局部常见率和全局罕见率的一种方法,或词频-逆向文件频率法

图1

加1的目的是避免除于0
1、词频 2、逆向文件频率法来减小这个数的权重
需要考虑语料库中的所有文档
* 图2

6、如何检索文档:最近邻域搜索

  • 定义一个距离量来衡量相似度
  • 输出为最相似的文档,一个一个进行遍历比较,留下最优选择
(一个简单变体叫K-近邻搜索)
  • 输出为一个相关文章的集合,最相关的k个不同的文章,建立一个优先队列来存放找到的K个最相关的文档

7、对所有主题文章进行分类,聚类,(标签)

  • 多元分类问题(监督学习)
    将待标签的文章,放入已经标签好的文章分类中,预测是什么类型的文章

  • 聚类:(无监督学习)
    在这里插入图片描述

输入:字数向量 输出:对语料库中的每一个文件添加某个集群标签
我们运行不需要任何(给定的)标签,我们只用到观测量本身,并试图揭示这些观测量的一些结构

8、如何定义一个聚类

1、集群中心、集群形状
2、只看集群中心(只需要测试观测点到集群中心的距离)

9、聚类算法

  • 只看测试观测点到集群中心的距离
K-means algorithm
  • 从最终得到K个集群的假设出发;(提前给出最终集群的数量)我们会看每个集群的平均值,只考虑集群中心,以此来将数据点分到不同的集群中
如何初始化集群中心的位置

1、把所以的数据点分到离它最近的集群中心(做这些判定的方法叫沃罗诺伊镶嵌算法)随机的
在这里插入图片描述

2、根据数据点的分配问题不断的更新集群中心的位置

10、聚类案例

  • 图像搜索聚类案例
  • 癫痫病人,根据发病记录,识别出癫痫的不同类型
  • 亚马逊上产品推荐(标签),相关联,族群
  • 组织网页搜索
  • 社区集合,相似社区的实际问题,实现信息共享,预测犯罪率

文档修复

1、数据获取

import graphlab 
#导入一些文本数据(维基百科关于人物的页面)
people = graghlab.SFrame('people_wiki.gl/')
people.head()

  • 查看有多少条记录
len(people)
#结果59071
  • 浏览数据集并查看它包含的文本
#特定一个人的信息
obama = people[people['name']=='Barack Obama']
obama['text']

在这里插入图片描述

2、获取关于奥巴马文章的单词统计

obama[‘word_count’] = graphlab.text_analytics.count_words(obama[‘text’])
print obama[‘word_count’]

3、给单词计数排序(在python中是一个字典)

键是各个单词,计数为单词出现的次数

obama_word_count_table = obama[['word_count']].stack('word_count',new_column_name = ['word','count'])
#stack()函数把SFrame里面字典的一列取出,和另外几列放在一起
obama_word_count_table.head()  #得到的结果并没有进行排序
#根据计数进行排序
obama_word_count_table.sort('count',ascending = False)#降序

结果显示为:
在这里插入图片描述

4、整个文章的TF/IDF

  • 计算整个文集中,各个单词的数量
people['word_count']=graphlab.text_analytics.count_words(people['text'])
people.head()

在这里插入图片描述

  • 计算TF/IDF
tfidf = graphlab.graphlab.text_analytics.tf_idf(people['word_count'])
tfidf

在这里插入图片描述

  • 得到一个TF/IDF字典,将TF/IDF列加入到任务的元表格中
people['tfidf'] = tfidf['docs']
  • 检查奥巴马这篇文章的tf/idf
obama = people[people['name']=='Barack Obama']
obama[['tfidf']].stack('tfidf',new_column_name = ['word','tfidf']).sort('tfidf',ascending=False)
#收集到奥巴马的tfidf信息,分开存储到word和tfidf两列中,并降序排列

在这里插入图片描述

5、手动计算几个人之间的距离,展示这个距离是什么样的,给一个TF/IDF 的整体印象

  • 取奥巴马为例
clinton = people[people['name']=='Bill Clinton']
beckham = people[people['name']=='David beckham']
  • 相比于贝克汉姆来讲,克林顿是不是更近呢
    有很多方法来度量相似度以及两个向量之间的距离,或者两个文件之间的差别
#使用距离矩阵  cosine数值越高,两个文章的相似度越高
graphlab.distance.cosine(obama['tfidf'][0],clinton['tfidf'][0])
#在这里我们想要的是距离,实验希望值越小越好
#加0的目的:我们要的是这张表的第0行,这张表仅有一个对象
#结果为0.83
graphlab.distance.cosine(obama['tfidf'][0],beckham['tfidf'][0])
#结果为0.97

6、如何才能自动找出一篇文章与其他文章之间的距离呢

  • 如何将最近邻算法模型运用到文章检索上
  • 使用nearest_neighbors离线模型,用单词create来创建哪一个最近邻模型
knn_model = graphlab.nearest_neighbors.create(people,features=['tdidf'],lable='name')

7、在文章上应用最近邻居模型,利用query()函数

 knn_model.query(obama)

在这里插入图片描述

8、文章检索的其他例子

swift = people[people['name']=='Taylor Swift']
knn_model.query(swift)

在这里插入图片描述

arnold = people[people['name']=='Arnold Schwarzenegger']
knn_model.query(arnold)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值