机器学习实战-基本算法总结3

机器学习基本算法总结

☞无监督学习

代码在这,基于python3(原书代码是python2)

这里只是一个总结,原书已经讲解很清楚了,不清楚的直接看代码

目录

==========================

一、预测数值型数据:回归

1.1 K-means算法的相关描述

———————————————————————————————————- 
优点:容易实现。
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢。
适用数据类型:数值型数据。
———————————————————————————————————- 
———————————————————————————————————- 
训练算法:不适用于无监督学习,即无监督学习没有训练过程。
测试算法:应用聚类算法、观察结果。可以使用量化的误差指标如误差平方和来评价算法的结果。
使用算法:可以用于所希望的任何应用。通常情况下,簇质心可以代表整个簇的数据来做出决策。
———————————————————————————————————- 

  聚类是一种无监督的学习,它将相似的对象归到同一簇中。聚类的方法几乎可以应用所有对象,簇内的对象越相似,聚类的效果就越好。K-means算法中的k表示的是聚类为k个簇,means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个的类的质心对该簇进行描述。
  聚类和分类最大的不同在于,分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来,所以,聚类有时也叫无监督学习。
  聚类分析试图将相似的对象归入同一簇,将不相似的对象归为不同簇,那么,显然需要一种合适的相似度计算方法,我们已知的有很多相似度的计算方法,比如欧氏距离,余弦距离,汉明距离等。事实上,我们应该根据具体的应用来选取合适的相似度计算方法。
  首先,随机确定k个初始点的质心;然后将数据集中的每一个点分配到一个簇中,即为每一个点找到距其最近的质心,并将其分配给该质心所对应的簇;该步完成后,每一个簇的质心更新为该簇所有点的平均值。伪代码如下:
创建女个点作为起始质心(经常是随机选择)
当任意一个点的簇分配结果发生改变时
 对养据集中的每个数据点
  对每个质心
   计算质心与数据点之间的距离
  将数据点分配到距其最近的簇
 对每一个簇,计算簇中所有点的均值并将均值作为质心

需要说明的是,在算法中,相似度的计算方法默认的是欧氏距离计算,当然也可以使用其他相似度计算函数,比如余弦距离;算法中,k个类的初始化方式为随机初始化,并且初始化的质心必须在整个数据集的边界之内,这可以通过找到数据集每一维的最大值和最小值;然后最小值+取值范围*0到1的随机数,来确保随机点在数据边界之内。
计算质心-分配-重新计算质心的方式反复迭代。算法停止的条件是,当然数据集所有的点分配的距其最近的簇不在发生变化时,就停止分配,更新所有簇的质心后,返回k个类的质心(一般是向量的形式)组成的质心列表,以及存储各个数据点的分类结果和误差距离的平方的二维矩阵。

2.后处理

  有时候当我们观察聚类的结果图时,发现聚类的效果没有那么好,显然,这种情况的原因是,算法收敛到了局部最小值,而并不是全局最小值,局部最小值显然没有全局最小值的结果好。那么,既然知道了算法已经陷入了局部最小值,如何才能够进一步提升K-means算法的效果呢?
  一种用于度量聚类效果的指标是SSE,即误差平方和, 为所有簇中的全部数据点到簇中心的误差距离的平方累加和。SSE的值如果越小,表示数据点越接近于它们的簇中心,即质心,聚类效果也越好。因为,对误差取平方后,就会更加重视那些远离中心的数据点
  显然,我们知道了一种改善聚类效果的做法就是降低SSE,那么如何在保持簇数目不变的情况下提高簇的质量呢?

方法一:  

  我们可以将具有最大SSE值得簇划分为两个簇(因为,SSE最大的簇一般情况下,意味着簇内的数据点距离簇中心较远),具体地,可以将最大簇包含的点过滤出来并在这些点上运行K-means算法,其中k设为2 ( 2个簇 ) 。
  同时,当把最大的簇(上图中的下半部分)分为两个簇之后,为了保证簇的数目是不变的,我们可以再合并两个簇。具体地:
  一方面我们可以合并两个最近的质心所对应的簇,即计算所有质心之间的距离,合并质心距离最近的两个质心所对应的簇。
  另一方面,我们可以合并两个使得SSE增幅最小的簇,显然,合并两个簇之后SSE的值会有所上升,那么为了最好的聚类效果,应该尽可能使总的SSE值小,所以就选择合并两个簇后SSE涨幅最小的簇。具体地,就是计算合并任意两个簇之后的总得SSE,选取合并后最小的SSE对应的两个簇进行合并。这样,就可以满足簇的数目不变。
  上面,是对已经聚类完成的结果进行改善的方法,在不改变k值的情况下,上述方法能够起到一定的作用,会使得聚类效果得到一定的改善。那么,下面要讲到的是一种克服算法收敛于局部最小值问题的K-means算法。即二分k-均值算法。

方法二:二分K-means算法

  二分K-means算法首先将所有点作为一个簇,然后将簇一分为二。之后选择其中一个簇继续进行划分,选择哪一个簇取决于对其进行划分是否能够最大程度的降低SSE的值。上述划分过程不断重复,直至划分的簇的数目达到用户指定的值为止。
伪代码:
将所有点看成一个簇
当簇数目小于k时
  对于每一个簇
    计算总误差
    在给定的簇上面进行k-均值聚类(k=2)
    计算将该簇一分为二之后的总误差
  选择使得总误差最小的簇进行划分

  当然,也可以选择SSE最大的簇进行划分,知道簇数目达到用户指定的数目为止。
  在上述算法中,直到簇的数目达到k值,算法才会停止。在算法中通过将所有的簇进行划分,然后分别计算划分后所有簇的误差。选择使得总误差最小的那个簇进行划分。划分完成后,要更新簇的质心列表,数据点的分类结果及误差平方。具体地,假设划分的簇为mm<k 个簇中的第i 个簇,那么这个簇分成的两个簇后,其中一个取代该被划分的簇,成为第i个簇,并计算该簇的质心;此外,将划分得到的另外一个簇,作为一个新的簇,成为第m+1个簇,并计算该簇的质心。此外,算法中还存储了各个数据点的划分结果和误差平方,此时也应更新相应的存储信息。这样,重复该过程,直至簇个数达到k。

小结

  1 聚类是一种无监督的学习方法。聚类区别于分类,即事先不知道要寻找的内容,没有预先设定好的目标变量。
  2 聚类将数据点归到多个簇中,其中相似的数据点归为同一簇,而不相似的点归为不同的簇。相似度的计算方法有很多,具体的应用选择合适的相似度计算方法
  3 K-means聚类算法,是一种广泛使用的聚类算法,其中k是需要指定的参数,即需要创建的簇的数目,K-means算法中的k个簇的质心可以通过随机的方式获得,但是这些点需要位于数据范围内。在算法中,计算每个点到质心得距离,选择距离最小的质心对应的簇作为该数据点的划分,然后再基于该分配过程后更新簇的质心。重复上述过程,直至各个簇的质心不再变化为止。
  4 K-means算法虽然有效,但是容易受到初始簇质心的情况而影响,有可能陷入局部最优解。为了解决这个问题,可以使用另外一种称为二分K-means的聚类算法。二分K-means算法首先将所有数据点分为一个簇;然后使用K-means(k=2)对其进行划分;下一次迭代时,选择使得SSE下降程度最大的簇进行划分;重复该过程,直至簇的个数达到指定的数目为止。实验表明,二分K-means算法的聚类效果要好于普通的K-means聚类算法。

===============================================================

二、基于apriori算法进行关联分析

1 关联分析

———————————————————————————————————- 
优点:易编码实现。’
缺点:在大数据集上可能较慢。
适用数据类型:数值型或者标称型数据。
———————————————————————————————————- 
———————————————————————————————————- 
训练算法:使用apriori算法来找到频繁项集。
测试算法:不需要测试过程。
使用算法:用于发现频繁项集以及物品之间的关联规则。
———————————————————————————————————- 

  从大规模数据集中寻找物品间的隐含关系被称作关联分析或者关联规则学习;
关联分析是一种在大规模数据集中寻找有趣关系的任务。这些关系可以有两种形式:频繁项 集或者关联规则。频繁项集(frequent item sets)是经常出现在一块的物品的集合,关联规则(association rules)暗示两种物品之间可能存在很强的关系。
  当寻找频繁项集时,频繁(frequent)的定义是什么? 有许多概念可以解答上述问题,不过其中最重要的是支持度和可信度
  支持度是指:数据集中包含某个项集的记录所占的比例。持度是针对项集来说的,因此可以定义一个最小支持度,而只保留满足最小支持度的项集。
  可信度或置信度是针对一条诸如{尿布} ➞ {葡萄酒}的关联规则来定义的。这
条规则的可信度被定义为“支持度({尿布, 葡萄酒})/支持度({尿布})”。假设{尿布, 葡萄酒}的支持度为3/5,尿布的支持度为4/5,所以“尿布 ➞ 葡萄酒”的可信度为3/4=0.75。
这意味着对于包含“尿布”的所有记录,我们的规则对其中75%的记录都适用。
  如果面对成千上万的数据,如生成一个物品所有可能组合的清单,然后对每一种组合统计它出现的频繁程度,但当物品成千上万时,上述做法非常非常慢。这里就需要引入Apriori原理来减少计算量。

2. 关联分析

  Apriori原理可以帮我们减少可能感兴趣的项集。Apriori原理是说如果某个项集是频繁的,那么它的所有子集也是频繁的。这个原理直观上并没有什么帮助,但是如果反过来看就有用了,也就是说如果一个项集是非频繁集,那么它的所有超集也是非频繁的。
  这里写图片描述

  这也就是说,一旦计算出了{2,3}的支持度,知道它是非频繁的之后,就不需要再计算{0,2,3}、{1,2,3}和{0,1,2,3}的支持度,因为我们知道这些集合不会满足我们的要求。使用该原理就可以避免项集数目的指数增长,从而在合理时间内算出频繁项集。
  Apriori算法是发现频繁项集的一种方法。 Apriori算法的两个输入参数分别是最小支持度和数据集该算法首先会生成所有单个物品的项集列表。接着扫描交易记录来查看哪些项集满足最小支持度要求,那些不满足最小支持度的集合会被去掉。然后,对剩下来的集合进行组合以生成包含两个元素的项集接下来,再重新扫描交易记录,去掉不满足最小支持度的项集。该过程重复进行直到所有项集都被去掉。
1.数据集伪代码如下:
对数据集中的每条交易记录tran
对每个候选项集can:
  检查一下can是否是tran的子集:
  如果是,则增加can的计数值  
对每个候选项集:
如果其支持度不低于最小值,则保留该项集
返回所有频繁项集列表

2.整个Apriori算法的伪代码如下:
当集合中项的个数大于0时
  构建一个k个项组成的候选项集的列表
  检查数据以确认每个项集都是频繁的
  保留频繁项集并构建奸1项组成的候选项集的列表

这里写图片描述  

3. 从频繁项集中挖掘关联规则

  人们最常寻找的两个目标是频繁项集与关联规则。上一节介绍如何使用Apriori算法来发现频繁项集,现在需要解决的问题是如何找出关联规则。
  对于关联规则,我们也有类似的量化方法,这种量化指标称为可信度。一条规则P ➞ H的可信度定义为 :support(P |H)/support(P) 。记住,在Python中,操作符 | 表示集合的并操作。P | H 是指所有出现在集合 P 或者集合 H 中的元素。
这里写图片描述
  可以观察到,如果某条规则并不满足最小可信度要求,那么该规则的所有子集也不会满足最小可信度要求。以上图为例,假设规则{0,1,2 ➞ 3}不满足最小可信度要求,那么就知道任何左部为{0,1,2}子集的规则也不会满足最小可信度要求。 可以利用关联规则的上述性质属性来减少需要测试的规则数目。
  可以利用关联规则的上述性质属性来减少需要测试的规则数目。首先从一个频繁项集开始,接着创建一个规则列表,其中规则右部只包含一个元素,然后对这些规则进行测试。接下来合并所有剩余规则来创建一个新的规则列表,其中规则右部包含两个元素。这种方法也被称作分级法,如上图所示。

4.总结

  (1)关联分析是用于发现大数据集中元素间有趣关系的一个工具集,可以采用两种方式来量化这些有趣的关系。
  第一种方式是使用频繁项集,它会给出经常在一起出现的元素项。
  第二种方式是关联规则,每条关联规则意味着元素项之间的“如果……那么”关系。
  
  (2)Apriori的方法简化了计算量,在合理的时间范围内找到频繁项集:
  Apriori原理是说如果一个元素项是不频繁的,那么那些包含该元素的超集也是不频繁的。

  (3)每次增加频繁项集的大小,Apriori算法都会重新扫描整个数据集。当数据集很大时,这会显著降低频繁项集发现的速度。下一章会介绍FP-growth算法 ,和Apriori算法相比,该算法只需要对数据库进行两次遍历,能够显著加快发现繁项集的速度。

===============================================================

三、使用FP-growth算法来高效发现频繁项集

1. 相关描述

———————————————————————————————————- 
优点:一般要快于Apriori。
缺点:实现比较困难,在某些数据集上性能会下降。
适用数据类型:标称型数据。
———————————————————————————————————- 
———————————————————————————————————- 
训练算法:构建一个FP树,并对树进行挖据。
测试算法:没有测试过程。
使用算法: 可用于识别经常出现的元素项,从而用于制定决策、推荐元素或进行预测等应用中。
———————————————————————————————————- 

  本章会在上一章讨论话题的基础上进行扩展,将给出一个非常好的频繁项集发现算法。该算法称作FP-growth,它比上一章讨论的Apriori算法要快。它基于Apriori构建,但在完成相同任务时采用了一些不同的技术。这里的任务是将数据集存储在一个特定的称作FP树的结构之后发现频繁项集或者频繁项对,即常在一块出现的元素项的集合FP树。FP-growth算法只需要对数据库进行两次扫描,而Apriori算法对于每个潜在的频繁项集都会扫描数据集判定给定模式是否频繁,因此FP-growth算法的速度要比Apriori算法快。
它发现频繁项集的基本过程如下:
(1) 构建FP树
(2) 从FP树中挖掘频繁项集

FP-growth算法的工作流程如下。首先构建FP树,然后利用它来挖掘频繁项集。为构建FP树,需要对原始数据集扫描两遍。1.第一遍对所有元素项的出现次数进行计数。记住第11章中给出的Apriori原理,即如果某元素是不频繁的,那么包含该元素的超集也是不频繁的,所以就不需要考虑这些超集。2.数据库的第一遍扫描用来统计出现的频率,而第二遍扫描中只考虑那些频繁元素

2.创建并构建FP树

  FP-growth算法将数据存储在一种称为FP树的紧凑数据结构中。FP代表频繁模式。一棵FP树看上去与计算机科学中的其他树结构类似,但是它通过链接(link)来连接相似元素,被连起来的元素项可以看成一个链表。
  在创建真正的频繁集FP树之前,需要对数据进行过滤(不符合频繁要求)和排序(按照频繁度排序)。利用头指针表,可以快速访问FP树中一个给定类型的所有元素。
  这里写图片描述

  这里使用一个字典作为数据结构,来保存头指针表。除了存放指针外,头指针表还可以用来保存FP树中每类元素的总数。
  1.第一次遍历数据集会获得每个元素项的出现频率。接下来,去掉不满足最小支持度的元素项。2.再下一步构建FP树。在构建时,读入每个项集并将其添加到一条已经存在的路径中。如果该路径不存在,则创建一条新路径。每个事务就是一个无序集合。假设有集合{z,x,y}和{y,z,r} ,那么在FP 树中 , 相同项会只表示一次。为了解决此问题,在将集合添加到树之前,需要对每个集合进行排序。排序基于元素项的绝对出现频率来进行。使用图12-2中的头指针节点值,对表12-1中数据进行过滤、重排序。过滤、排序后的事务依次添加到树中,如果树中巳存在现有元素,则增加现有元素的值;如果现有元素不存在,则向树添加一个分枝。

3. 从一棵 FP 树中挖掘频繁项集

从FP树中抽取频繁项集的三个基本步骤如下:
(1) 从FP树中获得条件模式基;
(2) 利用条件模式基,构建一个条件FP树
(3) 迭代重复步骤(1)步骤(2),直到树包含一个元素项为止。

条件模式基是以所查找元素项为结尾的路径集合。
每一条路径其实都是一条前缀路径(prefix path)。简而言之,一条前缀路径是介于所查找元素项与树根节点之间的所有内容。
对于每一个频繁项都要创建一棵条件FP树,使用条件模式基作为输入数据,用相同的建树代码构建条件树,之后递归地发现频繁项、发现条件模式基,并且继续构造条件树,直到条件树中没有元素。

4.总结

Apriori算法产生候选项集,然后扫描数据集来检查它们是否频繁。由于只对数据集扫描两次,因此FP-growth算法执行更快。
在FP-growth算法中,数据集存储在一个称为FP树的结构中。FP树构建完成后,可以通过查找元素项的条件基及构建条件FP树来发现频繁项集。该过程不断以更多元素作为条件重复进行,直到FP树只包含一个元素为止。
可以使用FP-growth算法在多种文本文档中查找频繁单词。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章