《集体智慧编程》读书笔记
书中涉及到一些机器学习相关的内容,在统计学习方法读书笔记和西瓜书读书笔记中有所记录,所以只简单带过.
书中使用的python技巧
- 字典的setdefault(key,value)方法,作用是如果键不在字典中,则添加键与默认值
- Feed Parser是一个解析RSS订阅源的库
- print(str,end='')可以实现输出不换行
- Beautiful Soup库是一个解析网页和构造结构化数据表达形式的函数库
- str.join(tuple,list,dict)用于将序列中的字符以str连接成一个新的字符串
- 使用urllib.request可以进行网页的下载
- portet stemmer是一个著名的python词干提取算法
第1章 集体智慧导言
- 集体智慧(collective intelligence)是指为了创造新的想法,而将一群人的行为,偏好或思想组合在一起.最早的应用如调查问卷或普查.在互联网中的典型应用有Wikipedia和Google.
第2章 提供推荐
- 协作型过滤(collaborative filtering):通常的做法是对一大群人进行搜索,并从中找出与我们品味相近的一小群人.算法会对这些人所偏爱的其他内容进行考查,并将它们组合起来构造出一个经过排名的推荐列表.
- 基于用户的协作型过滤:
- 搜集偏好:用一种方法表达不同人及其偏好.python可以用嵌套字典,对于规模较大的数据建议使用数据库.
- 寻找相近用户:计算人们在品味方面的相似度评价值.常用的有欧几里得距离(以被评价的物品为坐标轴,评价分数为坐标,每个点代表一个人.计算人们的距离远近.为了使偏好越相似的情况给出越大的值,可以将距离加1后取倒数)和皮尔逊相关度(以评价人为坐标轴,评价分数为坐标,每个点代表一件物品,使用一条直线来拟合这些点,根据拟合程度判断相似度.是协方差和标准差的商.好处是修正了"夸大分值"的情况).除此之外还有Jaccard系数或曼哈顿距离.
- 推荐物品:根据相似度评选出与自己相似度最高的n位用户,将他们的相似度作为权重,乘以他们对不同商品的评分后除以n位用户的相似度之和,就可以求得商品的加权评分.
- 匹配商品:我们还可以了解哪些商品是彼此相近的,只要将搜集偏好中的人与物品对换即可复用上述方法.
- 基于物品的协作型过滤:
- 在拥有大量数据集的情况下效果较好,而且不用在每次推荐时都计算一遍.总体思路是为每件物品预先计算好最为相近的其他物品.
- 构造物品比较数据集:首先将反映评价值的数据倒置处理,得到物品及其用户评价的列表,然后用上述方法得到相似度评价值并建立一个包含物品及其相近物品的字典.
- 获得推荐:对于每一件我们未评分的商品,都可以用已评分的商品和它的相近程度作为权重,乘上该已评分商品的评分来得到未评分商品的加权评分.将加权评分相加后除以总相似度即可得到未评分商品的评分.
- 对于稀疏数据集或大数据集,基于物品的过滤方法要优于基于用户的过滤方法,但它有维护物品相似度表的额外开销.而基于用户的过滤方法易于实现,而且无需额外步骤,因此更适用于小的变化非常频繁的数据集.
第3章 发现群组
- 数据聚类:用以寻找紧密相关的事物并将其可视化的方法,属于无监督学习
- 对博客用户进行分类:
- 单词计数:通过一组指定的词汇在每个博客订阅源中出现的次数可以构造出一个数据集.首先利用feedparser库解析订阅源并提取其中的单词列表,并筛选出其中出现比例适中的单词.然后将这些单词在每个博客中出现的次数以矩阵形式存储.
- 分级聚类:通过不断地将最为相似的群组两两合并来构造出一个群组的层级结构,其中的每个群组都是从单一元素开始的.可以用树状图的方式展现分级聚类的结果.
- 列聚类:在博客数据集中,行代表的是不同的博客,列代表的是单词.只要将之前得到的数据集转置就可以利用步骤1和2实现列聚类.需要注意的是,当数据项的数量比变量多的时候,出现无意义聚类的可能性就会增加.
- K-均值聚类:分级聚类的运行速度慢,而且数据其实没有被拆成不同的组.K-均值聚类则是先随机确定K个中心,然后将各个数据项分配个最近的中心点,再重新计算中心点,直到分组不再变化为止.
- 针对偏好的聚类:
- 使用BeautifulSoup库解析网页,生成一个用户和是否想要某件物品的矩阵
- 因为是否想要某物品只需要用0和1两种取值来表示,因此采用Tanimoto系数(即Jaccard系数)来度量距离.它代表的是交集与并集的比率.
- 选取一种聚类方法进行聚类
- 多维缩放:实际生活中要聚类的内容一般不只包含两个数值,可以为数据集找到一种二维表达形式.缩放可能会造成一些信息的丢失,但是缩放的结果有助于我们理解算法的原理.
- 先求得数据项两两间的距离
- 将所有数据项随机放置在二维图上
- 计算当前距离,并求出当前距离与目标距离的误差比例.根据误差比例大小决定数据项如何移动,实际上是其他节点对该节点的推或拉的综合效应,移动后计算总体误差.
- 重复步骤3,直到总体误差无法减小或循环次数到达上限为止.
第4章 搜索与排名
- 本章需要用到的searchindex.db下载地址
- 建立搜索引擎:
- 为了建立搜索引擎,首先要用爬虫搜集文档.先接受一小组等待建立索引的网页,再根据这些网页内部的链接进而找到其他的网页,以此类推,这一过程称为蛛行(spidering).
- 需要为全文索引建立数据库来保存单词和它们所在的文档以及位置,书中采用了SQLite.在使用数据库之前要先建立数据库Schema.
- 将爬取到的网页中的单词提取下来,并加入索引,这样就有了一个初步的可供一个单词查询的模型.
- 要实现多单词查询需要一个查询函数,它将查询字符串拆分为多个单词,然后查找那些包含所有不同单词的URL.
- 依据查询条件和网页内容有不同的评价度量,例如单词频度(单词在文档中出现的次数),文档位置(文档的主题可能出现在靠近文档开始处),单词距离(查询条件中的多个单词应该距离较近).
- 为了对不同方法的返回结果进行比较,需要进行归一化处理,令它们具有相同的值域及变化方向.
- 外部回指链接:除了基于网页内容进行评价度量之外,还可以通过考查外界就该网页所提供的信息(谁链向了网页以及它们的评价)来改善搜索结果.
- PageRank算法:为每个网页都赋予了一个指示网页重要程度的评价值PR值.以网页A为例,计算方法是指向A的每个网页的平均PR值乘以阻尼因子0.85,再加上一个最小值0.15,其中平均PR值为PR值除以网页中的链接总数.这种方法的前提是指向A的网页已有PR值,因此一开始为所有的网页设置一个任意初始值,然后通过反复计算迭代得到最终结果.
- 还可以根据指向某一网页的链接文本来决定网页的相关程度.综合这几种方法,并赋予它们不同的权重,就可以得到各异的搜索结果.
- 用户对于搜索结果的点击是一种很有用的数据.通过神经网络可以建立URL与查询单词在相关性上的紧密程度,通过反向传播法进行训练.