一、前言
本章中,我们将学习到如下内容:从各种不同的来源中构造算法所需的数据;两种不同的聚类算法;更多有关距离度量(distance metrics)的知识;简单的图形可视化代码,用以观察所生成的群组;最后,我们还会学习如何将异常复杂的数据集投影到二维空间中。
聚类时常被用于数据量很大(data-intensive)的应用中。跟踪消费者购买行为的零售商们,除了利用常规的消费者统计消息外,还可以利用这些信息自动检测出具有相似购买模式的消费者群体。年龄和收入都相仿的人也许会有迥然不同的着装风格,但是通过使用聚类算法,我们就可以找到“时装岛屿”,并据此开发出相应的零售或市场策略。聚类在计量生物学领域里也有大量的运用,我们用它来寻找具有相似行为的基因组,相应的研究结果可以表明,这些基因组中的基因会以同样的方式响应外界的活动,或者表明它们是相同生化通路中的一部分。
二、监督学习和无监督学习
(1)监督学习
利用样本输入和期望输出来学习如何预测的技术被称为监督学习法(supervised learning methods)。常用的监督学习法包括:神经网络、决策树、向量支持机以及贝叶斯过滤。采用这些方法的应用程序,会通过检查一组输入和期望的输出来进行“学习”。当我们想要利用这些方法中的任何一种来提取信息时,我们可以传入一组输入,然后期望应用程序能够根据其此前学到的知识来产生一个输出。
(2)无监督学习
聚类是无监督学习(unsupervised learning)的一个例子。与神经网络或决策树不同,无监督学习算法不是利用带有正确答案的样本数据进行“训练”。它们的目的是要在一组数据中找寻某种结构,而这些数据本身并不是我们要找的答案。在前面提到的时装的例子中,聚类的结果不会告诉零售商每一位顾客可能会买什么,也不会预测新来的顾客适合哪种时尚。聚类算法的目标是采集数据,然后从中找出不同的群组。其他无监督学习的例子还包括非负矩阵因式分解(non-negative matrix factorization)和自组织映射(self-organizing maps)。
三、对订阅源中的单词进行计数
几乎所有的博客都可以在线阅读,或者通过RSS订阅源进行阅读。RSS订阅源是一个包含博客及其所有文章条目信息的简单的XML文档。为了给每个博客中的单词计数,首先第一步就是要解析这些订阅源。所幸的是,有一个非常不错的程序能够完成这项工作,它就是Universal Feed Parser。从python的包或者使用pip安装feedparser包即可。
有了Universal Feed Parser,我们就可以很轻松地从任何RSS或Atom订阅源中得到标题、链接和文章的条目了。下一步,我们来编写一个从订阅源中提取所有单词的函数。新建一个feedvector.py,将下列代码加入。
import feedparser
import re
# 返回一个RSS订阅源的标题和包含单词计数情况的字典
def getwordcounts(url):
# 解析订阅源
d = feedparser.parse(url)
wc = {}
# 循环遍历所有的文章条目
for e in d.entries:
if 'summary' in e:
summary = e.summary
else:
summary = e.description
# 提取一个单词列表
words = getwords(e.title+''+summary)
for word in words:
wc.setdefault(word, 0)
wc[word] += 1
return d.feed.title, wc
每个RSS和Atom订阅源都会包含一个标题和一组文章条目。通常,每个文章条目都有一段摘要,或者是包含了条目中实际文本的描述性标签。函数getwordcounts将摘要传给函数getwords,后者会将其中所有的HTML标记剥离掉,并以非字母字符作为分隔符拆分出单词,再将给过以列表的形式加以返回。
def getwords(h