用最简单的语言来解释一下数据挖掘的十大算法(前五)

Posted 数盟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用最简单的语言来解释一下数据挖掘的十大算法(前五)相关的知识,希望对你有一定的参考价值。

盟(dataunion.org)是一个专注于数据应用的技术型社区,致力于成为培养与发现“数据科学家”的黄埔军校。数盟主要关注大数据、数据挖掘、数据分析、数据可视化等领域,倡导“数据价值的发现与应用”,助力企业、个人提升价值。

国内唯一的数据可视化在线课程,搜索网易云课堂“数盟数据可视化”,或点击文末阅读原文,轻松搞定数据可视化~


出处:伯乐在线

在一份调查问卷中,三个独立专家小组投票选出的十大最有影响力的数据挖掘算法,今天我打算用简单的语言来解释一下。

一旦你知道了这些算法是什么、怎么工作、能做什么、在哪里能找到,我希望你能把这篇博文当做一个跳板,学习更多的数据挖掘知识。

还等什么?这就开始吧!

用最简单的语言来解释一下数据挖掘的十大算法(前五)

1.PageRank算法

算法是做什么的?PageRank是为了决定一些对象和同网络中的其他对象之间的相对重要程度而设计的连接分析算法(link analysis algorithm)。

那么什么是连接分析算法呢?它是一类针对网络的分析算法,探寻对象间的关系(也可成为连接)。

举个例子:最流行的 PageRank 算法是 Google 的搜索引擎。尽管他们的搜索引擎不止是依靠它,但 PageRank依然是 Google 用来测算网页重要度的手段之一。

解释一下:

万维网上的网页都是互相链接的。如果 Rayli.net 链接到了 CNN 上的一个网页,CNN 网页就增加一个投票,表示 rayli.net 和 CNN 网页是关联的。

这还没有结束:

反过来,来自rayli.net 网页的投票重要性也要根据 rayli.net 网的重要性和关联性来权衡。换句话说,任何给 rayli.net 投票的网页也能提升 rayli.net 网页的关联性。

基本概括一下:

投票和关联性就是 PageRank 的概念。rayli.net 给CNN 投票增加了 CNN 的 Pagerank,rayli.net 的 PageRank级别同时也影响着它为 CNN 投票多大程度影响了CNN 的 PageRank。

那么 PageRank 的0,1,2,3级别是什么意思? 尽管 Google 并没有揭露PageRank 的精确含义,我们还是能了解它的大概意思。

我们能通过下面这些网站的PageRank得到些答案:

用最简单的语言来解释一下数据挖掘的十大算法(前五)

看到了么?

这排名有点像一个网页流行度的竞争。我们的头脑中都有了一些这些网站的流行度和关联度的信息。

PageRank只是一个特别讲究的方式来定义了这些而已。

PageRank还有什么其他应用呢? PageRank是专门为了万维网设计的。

可以考虑一下,以核心功能的角度看,PageRank算法真的只是一个处理链接分析极度有效率的方法。处理的被链接的对象不止只是针对网页。

下面是 PageRank3个创新的应用:

  1. 芝加哥大学的Dr Stefano Allesina,将 PageRank应用到了生态学中,测定哪个物种对可持续的生态系统至关重要。

  2. Twitter 研究出了一种叫 WTF(Who-to-Follow)算法,这是一种个性化的 PageRank推荐关注人的引擎。

  3. 香港理工大学的 Bin Jiang 使用一种变形的PageRank来预测基于伦敦地形指标的行人移动速率。

这算法是监督的还是非监督的?PageRank常用来发现一个网页的重要度关联度,通常被认为是一种非监督学习算法。

为什么使用PageRank?可以说,PageRank的主要卖点是:由于得到新相关链接具有难度,算法依然具有良好的鲁棒性。

更简单一点说,如果你又一个图或者网络,并想理解其中元素的相对重要性,优先性,排名或者相关性,可以用PageRank试一试。

哪里使用过它呢?Google 拥有PageRank 的商标。但是斯坦福大学取得了PageRank 算法的专利权。如果使用 PageRank,你可能会有疑问: 我不是律师,所以最好和一个真正的律师确认一下。但是只要和 Google 或斯坦福没有涉及到商业竞争,应该都是可以使用这个算法的。

给出PageRank 的三个实现:

1 C++ OpenSource PageRank Implementation

2 Python PageRank Implementation

3 igraph – The network analysis package (R)

2.AdaBoost 迭代算法

AdaBoost 算法是做什么的?AdaBoost 是个构建分类器的提升算法。

也许你还记得,分类器拿走大量数据,并试图预测或者分类新数据元素的属于的类别。

但是,提升(boost) 指的什么?提升是个处理多个学习算法(比如决策树)并将他们合并联合起来的综合的学习算法。目的是将弱学习算法综合或形成一个组,把他们联合起来创造一个新的强学习器。

强弱学习器之间有什么区别呢?弱学习分类器的准确性仅仅比猜测高一点。一个比较流行的弱分类器的例子就是只有一层的决策树。

另一个,强学习分类器有更高的准确率,一个通用的强学习器的例子就是 SVM。

举个 AdaBoost 算法的例子:我们开始有3个弱学习器,我们将在一个包含病人数据的数据训练集上对他们做10轮训练。数据集里包含了病人的医疗记录各个细节。

问题来了,那我们怎么预测某个病人是否会得癌症呢?AdaBoost 是这样给出答案的:

第一轮,AdaBoost 拿走一些训练数据,然后测试每个学习器的准确率。最后的结果就是我们找到最好的那个学习器。另外,误分类的样本学习器给予一个比较高的权重,这样他们在下轮就有很高的概率被选中了。

再补充一下,最好的那个学习器也要给根据它的准确率赋予一个权重,并将它加入到联合学习器中(这样现在就只有一个分类器了)

第二轮, AdaBoost 再次试图寻找最好的学习器。

关键部分来了,病人数据样本的训练数据现在被有很高误分配率的权重影响着。换句话说,之前误分类的病人在这个样本里有很高的出现概率。

为什么?

这就像是在电子游戏中已经打到了第二级,但当你的角色死亡后却不必从头开始。而是你从第二级开始然后集中注意,尽力升到第三级。

同样地,第一个学习者有可能对一些病人的分类是正确的,与其再度试图对他们分类,不如集中注意尽力处理被误分类的病人。

最好的学习器也被再次赋予权重并加入到联合分类器中,误分类的病人也被赋予权重,这样他们就有比较大的可能性再次被选中,我们会进行过滤和重复。

在10轮结束的时候,我们剩下了一个带着不同权重的已经训练过的联合学习分类器,之后重复训练之前回合中被误分类的数据。

这是个监督还是非监督算法?因为每一轮训练带有已经标记好数据集的弱训练器,因此这是个监督学习。

为什么使用 AdaBoost?AdaBoost算法简单, 编程相对来说简洁直白。

另外,它速度快!弱学习器 一般都比强学习器简单,简单意味着它们的运行速度可能更快。

还有件事:

因为每轮连续的Adaboost回合都重新定义了每个最好学习器的权重,因此这是个自动调整学习分类器的非常简洁的算法,你所要做的所有事就是指定运行的回合数。

最后,算法灵活通用,AdaBoost 可以加入任何学习算法,并且它能处理多种数据。

AdaBoost 有很多程序实现和变体。给出一些:

▪ scikit-learn

▪ ICSIBoost

▪ gbm: Generalized Boosted Regression Models

如果你喜欢Mr.Rogers,你会喜欢下面的算法的…

3.kNN:k最近邻算法

它是做什么的?kNN,或 K 最近邻(k-Nearest Neighbors), 诗歌分类算法。然而,它和我们之前描述的分类器不同,因为它是个懒散学习法。

什么是懒散学习法呢?和存储训练数据的算法不同,懒散学习法在训练过程中不需要做许多处理。只有当新的未被分类的数据输入时,这类算法才会去做分类。

但在另一方面,积极学习法则会在训练中建立一个分类模型,当新的未分类数据输入时,这类学习器会把新数据也提供给这个分类模型。

那么 C4.5,SVM 和 AdaBoost 属于哪类呢?不像 kNN算法,他们都是积极学习算法。

给出原因:

1 C4.5 在训练中建立了一个决策分类树模型。

2 SVM在训练中建立了一个超平面的分类模型。

3 AdaBoost在训练中建立了一个联合的分类模型。

那么 kNN 做了什么? kNN 没有建立这样的分类模型,相反,它只是储存了一些分类好的训练数据。那么新的训练数据进入时,kNN 执行两个基本步骤:

1 首先,它观察最近的已经分类的训练数据点—也就是,k最临近点(k-nearest neighbors)

2 第二部,kNN使用新数据最近的邻近点的分类, 就对新数据分类得到了更好的结果了。

你可能会怀疑…kNN 是怎么计算出最近的是什么? 对于连续数据来说,kNN 使用一个像欧氏距离的距离测度,距离测度的选择大多取决于数据类型。有的甚至会根据训练数据学习出一种距离测度。关于 kNN 距离测度有更多的细节讨论和论文描述。

对于离散数据,解决方法是可以把离散数据转化为连续数据。给出两个例子:

1 使用汉明距离(Hamming distance )作为两个字符串紧密程度的测度。

2 把离散数据转化为二进制表征。

这两个来自Stack Overflow的思路也有一些关于处理离散数据的建议:

▪ KNN classification with categorical data

▪ Using k-NN in R with categorical values

当临近的点是不同的类,kNN 怎么给新数据分类呢?当临近点都是同一类的时候,kNN 也就不费力气了。我们用直觉考虑,如果附近点都一致,那么新数据点就很可能落入这同一个类中了。

我打赌你能猜到事情是从哪里开始变的麻烦的了…

当临近点不是同一类时,kNN 怎么决定分类情况的呢?

处理这种情况通常有两种办法:

1 通过这些临近点做个简单的多数投票法。哪个类有更多的票,新数据就属于那个类。

2 还是做个类似的投票,但是不同的是,要给那些离的更近的临近点更多的投票权重。这样做的一个简单方法是使用反距离(reciprocal distance). 比如,如果某个临近点距离5个单位,那么它的投票权重就是1/5.当临近点越来越远是,倒数距离就越来越小…这正是我们想要的。

这是个监督算法还是非监督的呢?因为 kNN 算法提供了已经被分类好的数据集,所以它是个监督学习算法。

为什么我们会用 kNN?便于理解和实现是我们使用它的两个关键原因。根据距离测度的方法,kNN 可能会非常精确。

但是这还只是故事的一部分,下面是我们需要注意的5点:

1 当试图在一个大数据集上计算最临近点时,kNN 算法可能会耗费高昂的计算成本。

2 噪声数据(Noisy data)可能会影响到 kNN 的分类。

3 选择大范围的属性筛选(feature)会比小范围的筛选占有很多优势,所以属性筛选(feature)的规模非常重要。

4 由于数据处理会出现延迟,kNN 相比积极分类器,一般需要更强大的存储需求。

5 选择一个合适的距离测度对 kNN 的准确性来说至关重要。

哪里用过这个方法?有很多现存的 kNN 实现手段:

▪ MATLAB k-nearest neighbor classification

▪ scikit-learn KNeighborsClassifier

▪ k-Nearest Neighbour Classification in R

是不是垃圾,先别管了。先读读下面的算法吧….

4. Naive Bayes 朴素贝叶斯算法

算法是做什么的?朴素贝叶斯(Naive Bayes)并不只是一个算法,而是一系列分类算法,这些算法以一个共同的假设为前提:

被分类的数据的每个属性与在这个类中它其他的属性是独立的。

独立是什么意思呢?当一个属性值对另一个属性值不产生任何影响时,就称这两个属性是独立的。

举个例子:

比如说你有一个病人的数据集,包含了病人的脉搏,胆固醇水平,体重,身高和邮编这样的属性。如果这些属性值互相不产生影响,那么所有属性都是独立的。对于这个数据集来说,假定病人的身高和邮编相互独立,这是合理的。因为病人的身高和他们的邮编没有任何关系。但是我们不能停在这,其他的属性间是独立的么?

很遗憾,答案是否定的。给出三个并不独立的属性关系:

▪ 如果身高增加,体重可能会增加。

▪ 如果胆固醇水平增加,体重可能增加。

▪ 如果胆固醇水平增加,脉搏也可能会增加。

以我的经验来看,数据集的属性一般都不是独立的。

这样就和下面的问题联系起来了…

为什么要把算法称为朴素的(naive)呢?数据集中所有属性都是独立的这个假设正是我们称为朴素(naive)的原因—— 通常下例子中的所有属性并不是独立的。

什么是贝叶斯(Bayes)?Thomas Bayes 是一个英国统计学家,贝叶斯定理就是以他名字命名的。点击这个链接可以知道更多贝叶斯定理的内容(Bayes’ Theorem)

总而言之,根据给定的一系列属性信息,借用概率的知识,我们可以使用这个定理来预测分类情况。

分类的简化等式看起来就像下面的这个式子:

用最简单的语言来解释一下数据挖掘的十大算法(前五)

我们在深入研究一下..

这个等式是什么意思?在属性1和属性2的条件下,等式计算出了A 类的概率。换句话说,如果算出属性1 和2,等式算出的数据属于 A 类的概率大小。

等式这样写解释为:在属性1和属性2条件下,分类 A 的概率是一个分数。

▪ 分数的分子是在分类 A条件下属性1的概率,乘以在分类 A 条件下属性2的概率,再乘以分类 A 的概率

▪ 分数的分母是属性1的概率乘以属性2的概率。

举个 Naive Bayes 的例子,下面是一个从 Stack Overflow thread (Ram’s answer)中找到的一个好例子。

事情是这样的:

▪ 我们有个1000个水果的训练数据集。

▪ 水果可能是香蕉,橘子或者其他(这些水果种类就是类)

▪ 水果可能是长形的、甜的、或者黄颜色的(这些是属性).

用最简单的语言来解释一下数据挖掘的十大算法(前五)

在这个训练集中你发现了什么?

▪ 500个香蕉中,长的有400个、甜的有350个、黄色的450个

▪ 300个橘子中、没有长的、甜的150个、黄色的300个

▪ 还剩下的200个水果中、长的100个、甜的150个、黄色的50个

如果我们根据长度、甜度和水果颜色,在不知道它们类别的情况下,我们现在可以计算水果是香蕉、橘子或者其他水果的概率了。

假设我们被告知这个未分类的水果是长的、甜的、黄色的。

下面我们以4个步骤来计算所有的概率:

第一步:想要计算水果是香蕉的概率,我们首先发现这个式子看起来很熟悉。这就是在属性为长形、甜和黄色的条件下,水果是香蕉类的概率,这个表达更简洁一些:

用最简单的语言来解释一下数据挖掘的十大算法(前五)

这确实就像我们之前讨论的那个等式。

第二步:以分子开始,让我们把公式的所有东西都加进去。

用最简单的语言来解释一下数据挖掘的十大算法(前五)

用最简单的语言来解释一下数据挖掘的十大算法(前五)

用最简单的语言来解释一下数据挖掘的十大算法(前五)

用最简单的语言来解释一下数据挖掘的十大算法(前五)

像公式一样,把所有的都乘起来,我们就得到了:

用最简单的语言来解释一下数据挖掘的十大算法(前五)

第三步:不用管分母了,因为计算别的分类时分子是一样的。

第四步:计算其他类时也做类似的计算:

用最简单的语言来解释一下数据挖掘的十大算法(前五)

因为0.252大于0.01875,Naive Bayes 会把长形,甜的还是黄色水果分到香蕉的一类中。

这是个监督算法还是非监督算法呢? 为了得到频数表,Naive Bayes 提供了已经分好类的训练数据集,所以这是个监督学习算法。

为什么使用 Naive Bayes?就像你在上面看到的例子一样,Naive Bayes 只涉及到了简单的数学知识。加起来只有计数、乘法和除法而已。

一旦计算好了频数表(frequency tables),要分类一个未知的水果只涉及到计算下针对所有类的概率,然后选择概率最大的即可。

尽管算法很简单,但是 Naive Bayes 却出人意料的十分精确。比如,人们发现它是垃圾邮件过滤的高效算法。

Naive Bayes 的实现可以从Orange, scikit-learn, Weka 和 R 里面找到。

5.C4.5算法

C4.5是做什么的?C4.5 以决策树的形式构建了一个分类器。为了做到这一点,需要给定 C4.5 表达内容已分类的数据集合。

等下,什么是分类器呢? 分类器是进行数据挖掘的一个工具,它处理大量需要进行分类的数据,并尝试预测新数据所属的类别。

举个例子吧,假定一个包含很多病人信息的数据集。我们知道每个病人的各种信息,比如年龄、脉搏、血压、最大摄氧量、家族病史等。这些叫做数据属性。

现在:

给定这些属性,我们想预测下病人是否会患癌症。病人可能会进入下面两个分类:会患癌症或者不会患癌症。 C4.5 算法会告诉我们每个病人的分类。

做法是这样的:

用一个病人的数据属性集和对应病人的反馈类型,C4.5 构建了一个基于新病人属性预测他们类型的决策树。

这点很棒,那么什么是决策树呢?决策树学习是创建一种类似与流程图的东西对新数据进行分类。使用同样的病人例子,一个特定的流程图路径可以是这样的:

  • 病人有癌症的病史

  • 病人有和癌症病人高度相似的基因表达

  • 病人有肿瘤

  • 病人的肿瘤大小超过了5cm

基本原则是:

流程图的每个环节都是一个关于属性值的问题,并根据这些数值,病人就被分类了。你可以找到很多决策树的例子。

算法是监督学习还是无监督学习呢?这是一个监督学习算法,因为训练数据是已经分好类的。使用分好类的病人数据,C4.5算法不需要自己学习病人是否会患癌症。

那 C4.5 算法和决策树系统有什么区别呢?

首先,C4.5 算法在生成信息树的时候使用了信息增益。

其次,尽管其他系统也包含剪枝,C4.5使用了一个单向的剪枝过程来缓解过渡拟合。剪枝给结果带来了很多改进。

再次,C4.5算法既可以处理连续数据也可以处理离散数据。我的理解是,算法通过对连续的数据指定范围或者阈值,从而把连续数据转化为离散的数据。

最后,不完全的数据用算法自有的方式进行了处理。

为什么使用 C4.5算法呢?可以这么说,决策树最好的卖点是他们方便于翻译和解释。他们速度也很快,是种比较流行的算法。输出的结果简单易懂。

哪里可以使用它呢? 在 OpenTox 上可以找到一个很流行的开源 Java实现方法。Orange 是一个用于数据挖掘的开源数据可视化和分析工具,它的决策树分类器是用 C4.5实现的。

分类器是很棒的东西,但也请看看下一个聚类算法….

英文出处:rayli

除了上述的10种算法,这里还总结了其他常用的挖掘算法,也许会有你想要的:

1.FP-Tree(频繁模式树)算法。这个算法也有被称为FP-growth算法,这个算法克服了Apriori算法的产生过多侯选集的缺点,通过递归的产生频度模式树,然后对树进行挖掘,后面的过程与Apriori算法一致。

2.HITS算法。HITS算法是另外一个链接算法,部分原理与PageRank算法是比较相似的,HITS算法引入了权威值和中心值的概念,HITS算法是受用户查询条件影响的,他一般用于小规模的数据链接分析,也更容易遭受到攻击。

3.BIRCH算法。BIRCH算法利用构建CF聚类特征树作为算法的核心,通过树的形式,BIRCH算法扫描数据库,在内存中建立一棵初始的CF-树,可以看做数据的多层压缩。

4.GSP算法。GSP算法是序列模式挖掘算法。GSP算法也是Apriori类算法,在算法的过程中也会进行连接和剪枝操作,不过在剪枝判断的时候还加上了一些时间上的约束等条件。

5.PreFixSpan算法。PreFixSpan算法是另一个序列模式挖掘算法,在算法的过程中不会产生候选集,给定初始前缀模式,不断的通过后缀模式中的元素转到前缀模式中,而不断的递归挖掘下去。

6.CBA(基于关联规则分类)算法。CBA算法是一种集成挖掘算法,因为他是建立在关联规则挖掘算法之上的,在已有的关联规则理论前提下,做分类判断,只是在算法的开始时对数据做处理,变成类似于事务的形式。

7.RoughSets(粗糙集)算法。粗糙集理论是一个比较新颖的数据挖掘思想。这里使用的是用粗糙集进行属性约简的算法,通过上下近似集的判断删除无效的属性,进行规制的输出。

8.gSpan算法。gSpan算法属于图挖掘算法领域。主要用于频繁子图的挖掘,相较于其他的图算法,子图挖掘算法是他们的一个前提或基础算法。gSpan算法用到了DFS编码,和Edge五元组,最右路径子图扩展等概念,算法比较的抽象和复杂。

关于我们 ID:DataScientistUnion

数盟网站:www.dataunion.org

数盟微博:@数盟社区

数盟微信:DataScientistUnion

数盟【大数据群】272089418

数盟【数据可视化群】 179287077

数盟【数据分析群】 174306879

(长按可关注)



点击[阅读原文] 国内唯一数据可视化在线课程



以上是关于用最简单的语言来解释一下数据挖掘的十大算法(前五)的主要内容,如果未能解决你的问题,请参考以下文章

C++基础语法梳理:算法丨十大排序算法

面试官常问十大经典算法排序(用Python实现)

必学十大经典排序算法,看这篇就够了(附完整代码/动图/优质文章)

❤️五万字《十大排序算法》动图讲解❤️(建议收藏)

❤️五万字《十大排序算法》动图讲解❤️(建议收藏)

十大经典排序算法小结