数据挖掘算法

一、Apriori 关联算法

Apriori算法学习数据的关联规则(association rules),适用于包含大量事务(transcation)的数据库。

关联规则学习是学习数据库中不同变量中的相互关系的一种数据挖掘技术。

你可能会对 Apriori 算法如何工作有疑问,在进入算法本质和细节之前,得先明确3件事情:

第一是你的项集的大小,你想看到的模式是2-itemset或3-itemset 还是其他的?
第二是你支持的项集,或者是从事务的总数划分出的事务包含的项集。一个满足支持度的项集叫做频繁项集。
第三是根据你已经统计的项集中某些数据项,计算其他某个数据项出现的信心水准或是条件概率

基本的 Apriori 算法有三步:

参与,扫描一遍整个数据库,计算1-itemsets 出现的频率。
剪枝,满足支持度和可信度的这些1-itemsets移动到下一轮流程,再寻找出现的2-itemsets。
重复,对于每种水平的项集 一直重复计算,知道我们之前定义的项集大小为止。
这个算法是监督的还是非监督的?Apriori 一般被认为是一种非监督的学习方法,因为它经常用来挖掘和发现有趣的模式和关系。

但是,等下,还有呢…对Apriori 算法改造一下也能对已经标记好的数据进行分类。

为什么使用Apriori 算法?它易于理解,应用简单,还有很多的派生算法。

但另一方面…

当生成项集的时候,算法是很耗费内存、空间和时间。

大量的 Apriori 算法的语言实现可供使用。比较流行的是 ARtool, Weka, and Orange。

二、k 均值聚类算法

它是做什么的呢?K-聚类算法从一个目标集中创建多个组,每个组的成员都是比较相似的。这是个想要探索一个数据集时比较流行的聚类分析技术。

等下,什么是聚类分析呢?聚类分析属于设计构建组群的算法,这里的组成员相对于非组成员有更多的相似性。在聚类分析的世界里,类和组是相同的意思。
举个例子,假设我们定义一个病人的数据集。在聚类分析里,这些病人可以叫做观察对象。我们知道每个病人的各类信息,比如年龄、血压、血型、最大含氧量和胆固醇含量等。这是一个表达病人特性的向量。

请看:

你可以基本认为一个向量代表了我们所知道的病人情况的一列数据。这列数据也可以理解为多维空间的坐标。脉搏是一维坐标,血型是其他维度的坐标等等。

你可能会有疑问:

给定这个向量集合,我们怎么把具有相似年龄、脉搏和血压等数据的病人聚类呢?

想知道最棒的部分是什么吗?

你告诉 k-means 算法你想要多少种类。K-means 算法会处理后面的部分。

那它是怎么处理的呢?k-means 算法有很多优化特定数据类型的变量。

Kmeans算法更深层次的这样处理问题:

k-means 算法在多维空间中挑选一些点代表每一个 k 类。他们叫做中心点。
每个病人会在这 k 个中心点中找到离自己最近的一个。我们希望病人最靠近的点不要是同一个中心点,所以他们在靠近他们最近的中心点周围形成一个类。
我们现在有 k 个类,并且现在每个病人都是一个类中的一员。
之后k-means 算法根据它的类成员找到每个 k 聚类的中心(没错,用的就是病人信息向量)
这个中心成为类新的中心点。
因为现在中心点在不同的位置上了,病人可能现在靠近了其他的中心点。换句话说,他们可能会修改自己的类成员身份。
重复2-6步直到中心点不再改变,这样类成员也就稳定了。这也叫做收敛性。
这算法是监督的还是非监督的呢?这要看情况了,但是大多数情况下 k-means 会被划分为非监督学习的类型。并不是指定分类的个数,也没有观察对象该属于那个类的任何信息,k-means算法自己“学习”如何聚类。k-means 可以是半监督的。

为什么要使用 k-means 算法呢?我认为大多数人都同意这一点:

k-means 关键卖点是它的简单。它的简易型意味着它通常要比其他的算法更快更有效,尤其是要大量数据集的情况下更是如此。

他可以这样改进:

k-means 可以对已经大量数据集进行预先聚类处理,然后在针对每个子类做成本更高点的聚类分析。k-means 也能用来快速的处理“K”和探索数据集中是否有被忽视的模式或关系。

但用k-means 算法也不是一帆风顺的:

k means算法的两个关键弱点分别是它对异常值的敏感性和它对初始中心点选择的敏感性。最后一个需要记住的是, K-means 算法是设计来处理连续数据的。对于离散数据你需要使用一些小技巧后才能让 K-means 算法奏效。

三、支持向量机

它是做什么的呢?支持向量机(SVM)获取一个超平面将数据分成两类。以高水准要求来看,除了不会使用决策树以外,SVM与 C4.5算法是执行相似的任务的。

咦?一个超..什么? 超平面(hyperplane)是个函数,类似于解析一条线的方程。实际上,对于只有两个属性的简单分类任务来说,超平面可以是一条线的。

其实事实证明:

SVM 可以使用一个小技巧,把你的数据提升到更高的维度去处理。一旦提升到更高的维度中,SVM算法会计算出把你的数据分离成两类的最好的超平面。

有例子么?当然,举个最简单的例子。我发现桌子上开始就有一堆红球和蓝球,如果这这些球没有过分的混合在一起,不用移动这些球,你可以拿一根棍子把它们分离开。

你看,当在桌上加一个新球时,通过已经知道的棍字的哪一边是哪个颜色的球,你就可以预测这个新球的颜色了。

最酷的部分是什么呢?SVM 算法可以算出这个超平面的方程。

如果事情变得更复杂该怎么办?当然了,事情通常都很复杂。如果球是混合在一起的,一根直棍就不能解决问题了。

下面是解决方案:

快速提起桌子,把所有的球抛向空中,当所有的球以正确的方式抛在空中是,你使用一张很大的纸在空中分开这些球。

你可能会想这是不是犯规了。不,提起桌子就等同于把你的数据映射到了高维空间中。这个例子中,我们从桌子表面的二维空间过度到了球在空中的三维空间。

那么 SVM该怎么做呢?通过使用核函数(kernel),我们在高维空间也有很棒的操作方法。这张大纸依然叫做超平面,但是现在它对应的方程是描述一个平面而不是一条线了。根据 Yuval 的说法,一旦我们在三维空间处理问题,超平面肯定是一个面而不是线了。

关于 SVM的解释思路,Reddit 的 ELI5 和 ML 两个子版块上也有两个很棒的讨论帖。

那么在桌上或者空中的球怎么用现实的数据解释呢?桌上的每个球都有自己的位置,我们可以用坐标来表示。打个比方,一个球可能是距离桌子左边缘20cm 距离底部边缘 50 cm,另一种描述这个球的方式是使用坐标(x,y)或者(20,50)表达。x和 y 是代表球的两个维度。

可以这样理解:如果我们有个病人的数据集,每个病人可以用很多指标来描述,比如脉搏,胆固醇水平,血压等。每个指标都代表一个维度。

基本上,SVM 把数据映射到一个更高维的空间然后找到一个能分类的超平面。

类间间隔(margin)经常会和 SVM 联系起来,类间间隔是什么呢?它是超平面和各自类中离超平面最近的数据点间的距离。在球和桌面的例子中,棍子和最近的红球和蓝球间的距离就是类间间隔(margin)。

SVM 的关键在于,它试图最大化这个类间间隔,使分类的超平面远离红球和蓝球。这样就能降低误分类的可能性。

那么支持向量机的名字是哪里来的?还是球和桌子的例子中,超平面到红球和蓝球的距离是相等的。这些球或者说数据点叫做支持向量,因为它们都是支持这个超平面的。

那这是监督算法还是非监督的呢?SVM 属于监督学习。因为开始需要使用一个数据集让 SVM学习这些数据中的类型。只有这样之后 SVM 才有能力对新数据进行分类。

为什么我们要用 SVM 呢? SVM 和 C4.5大体上都是优先尝试的二类分类器。根据“没有免费午餐原理”,没有哪一种分类器在所有情况下都是最好的。此外,核函数的选择和可解释性是算法的弱点所在。

在哪里使用 SVM?有什么 SVM 的实现方法,比较流行的是用scikit-learn, MATLAB 和 libsvm实现的这几种。

四、决策树C4.5

定义:分类树(决策树)是一种十分常用的分类方法。他是一种监管学习,所谓监管学习说白了很简单,就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类。这样的机器学习就被称之为监督学习。分类本质上就是一个map的过程。C4.5分类树就是决策树算法中最流行的一种。
算法简介:

1.  Function C4.5(R:包含连续属性的无类别属性集合,C:类别属性,S:训练集)    
2.  /*返回一棵决策树*/    
3.  Begin    
4.     If S为空,返回一个值为Failure的单个节点;    
5.     If S是由相同类别属性值的记录组成,    
6.        返回一个带有该值的单个节点;    
7.     If R为空,则返回一个单节点,其值为在S的记录中找出的频率最高的类别属性值;    
8.     [注意未出现错误则意味着是不适合分类的记录];    
9.    For 所有的属性R(Ri) Do    
10.          If 属性Ri为连续属性,则    
11.       Begin    
12.             将Ri的最小值赋给A1:    
13.          将Rm的最大值赋给Am;/*m值手工设置*/    
14.             For j From 2 To m-1 Do Aj=A1+j*(A1Am)/m;    
15.             将Ri点的基于{< =Aj,>Aj}的最大信息增益属性(Ri,S)赋给A;    
16.       End17.    将R中属性之间具有最大信息增益的属性(D,S)赋给D;    
18.     将属性D的值赋给{dj/j=1,2...m}19.    将分别由对应于D的值为dj的记录组成的S的子集赋给{sj/j=1,2...m};    
20.     返回一棵树,其根标记为D;树枝标记为d1,d2...dm;    
21.     再分别构造以下树:    
22.     C4.5(R-{D},C,S1),C4.5(R-{D},C,S2)...C4.5(R-{D},C,Sm);    
23.  End C4.5

你可能感兴趣的:(数据挖掘,数据挖掘,算法)