在一份调查问卷中,三个独立专家小组投票选出的十大最有影响力的数据挖掘算法,今天我打算用简单的语言来解释一下。
还等什么?这就开始吧!
举个例子吧,假定一个包含很多病人信息的数据集。我们知道每个病人的各种信息,比如年龄、脉搏、血压、最大摄氧量、家族病史等。这些叫做数据属性。
现在:
给定这些属性,我们想预测下病人是否会患癌症。病人可能会进入下面两个分类:会患癌症或者不会患癌症。C4.5算法会告诉我们每个病人的分类。
做法是这样的:
基本原则是:
首先,C4.5算法在生成信息树的时候使用了信息增益。
其次,尽管其他系统也包含剪枝,C4.5使用了一个单向的剪枝过程来缓解过渡拟合。剪枝给结果带来了很多改进。
再次,C4.5算法既可以处理连续数据也可以处理离散数据。我的理解是,算法通过对连续的数据指定范围或者阈值,从而把连续数据转化为离散的数据。
最后,不完全的数据用算法自有的方式进行了处理。
分类器是很棒的东西,但也请看看下一个聚类算法….
它是做什么的呢?K-聚类算法从一个目标集中创建多个组,每个组的成员都是比较相似的。这是个想要探索一个数据集时比较流行的聚类分析技术。
等下,什么是聚类分析呢?聚类分析属于设计构建组群的算法,这里的组成员相对于非组成员有更多的相似性。在聚类分析的世界里,类和组是相同的意思。
举个例子,假设我们定义一个病人的数据集。在聚类分析里,这些病人可以叫做观察对象。我们知道每个病人的各类信息,比如年龄、血压、血型、最大含氧量和胆固醇含量等。这是一个表达病人特性的向量。
请看:
你可以基本认为一个向量代表了我们所知道的病人情况的一列数据。这列数据也可以理解为多维空间的坐标。脉搏是一维坐标,血型是其他维度的坐标等等。
你可能会有疑问:
给定这个向量集合,我们怎么把具有相似年龄、脉搏和血压等数据的病人聚类呢?
想知道最棒的部分是什么吗?
你告诉k-means算法你想要多少种类。K-means算法会处理后面的部分。
那它是怎么处理的呢?k-means算法有很多优化特定数据类型的变量。
为什么要使用k-means算法呢?我认为大多数人都同意这一点:
k-means关键卖点是它的简单。它的简易型意味着它通常要比其他的算法更快更有效,尤其是要大量数据集的情况下更是如此。
他可以这样改进:
k-means可以对已经大量数据集进行预先聚类处理,然后在针对每个子类做成本更高点的聚类分析。k-means也能用来快速的处理“K”和探索数据集中是否有被忽视的模式或关系。
但用k-means算法也不是一帆风顺的:
kmeans算法的两个关键弱点分别是它对异常值的敏感性和它对初始中心点选择的敏感性。最后一个需要记住的是,K-means算法是设计来处理连续数据的。对于离散数据你需要使用一些小技巧后才能让K-means算法奏效。
咦?一个超..什么?超平面(hyperplane)是个函数,类似于解析一条线的方程。实际上,对于只有两个属性的简单分类任务来说,超平面可以是一条线的。
其实事实证明:
有例子么?当然,举个最简单的例子。我发现桌子上开始就有一堆红球和蓝球,如果这这些球没有过分的混合在一起,不用移动这些球,你可以拿一根棍子把它们分离开。
你看,当在桌上加一个新球时,通过已经知道的棍字的哪一边是哪个颜色的球,你就可以预测这个新球的颜色了。
如果事情变得更复杂该怎么办?当然了,事情通常都很复杂。如果球是混合在一起的,一根直棍就不能解决问题了。
下面是解决方案:
快速提起桌子,把所有的球抛向空中,当所有的球以正确的方式抛在空中是,你使用一张很大的纸在空中分开这些球。
你可能会想这是不是犯规了。不,提起桌子就等同于把你的数据映射到了高维空间中。这个例子中,我们从桌子表面的二维空间过度到了球在空中的三维空间。
那么在桌上或者空中的球怎么用现实的数据解释呢?桌上的每个球都有自己的位置,我们可以用坐标来表示。打个比方,一个球可能是距离桌子左边缘20cm距离底部边缘50cm,另一种描述这个球的方式是使用坐标(x,y)或者(20,50)表达。x和y是代表球的两个维度。
可以这样理解:如果我们有个病人的数据集,每个病人可以用很多指标来描述,比如脉搏,胆固醇水平,血压等。每个指标都代表一个维度。
下面要介绍的算法是我最喜欢的算法之一:
但另一方面…
下一个算法对我来说是最难的,一起来看下吧。
在统计学上,当估算带有无法观测隐藏变量的统计模型参数时,EM算法不断迭代和优化可以观测数据的似然估计值。
好,稍等让我解释一下…
我不是一个统计学家,所以希望我的简洁表达能正确并能帮助理解。
下面是一些概念,能帮我们更好的理解问题。
这很不错,那模型的参数又是什么呢?作为模型的一部分,分布属性正是由参数来描述的。例如,一个钟形曲线可以用它的均值和方差来描述。
还是使用考试的例子,一场考试的分数分布(可测量的结果)符合一个钟形曲线(就是分布)。均值是85,方差是100.
那么,似然性呢?回到我们之前的钟形曲线例子,假设我们已经拿到很多的分数数据,并被告知分数符合一个钟形曲线。然而,我们并没有给到所有的分数,只是拿到了一个样本。
可以这样做:
我们不知道所有分数的平均值或者方差,但是我们可以使用样本计算它们。似然性就是用估计的方差和平均值得到的钟形曲线在算出很多分数的概率。
换句话说,给定一系列可测定的结果,让我们来估算参数。再使用这些估算出的参数,得到结果的这个假设概率就被称为似然性。
记住,这是已存在分数的假设概率,并不是未来分数的概率。
你可能会疑问,那概率又是什么?
还用钟形曲线的例子解释,假设我们知道均值和方差。然我们被告知分数符合钟形曲线。我们观察到的某些分数的可能性和他们多久一次的被观测到就是概率。
更通俗的讲,给定参数,让我们来计算可以观察到什么结果。这就是概率为我们做的事情。
很好,现在,观测到的数据和未观测到的隐藏数据区别在哪里?观测到的数据就是你看到或者记录的数据。未观测的数据就是遗失的数据。数据丢失的原因有很多(没有记录,被忽视了,等等原因)。
再说一次,当估算带有无法观测隐藏变量的统计模型参数时,EM算法不断迭代和优化可以观测数据的似然估计值。希望现在再说更容易理解了。
算法的精髓在于:
通过优化似然性,EM生成了一个很棒的模型,这个模型可以对数据点指定类型标签—听起来像是聚类算法!
EM算法是怎么帮助实现聚类的呢?EM算法以对模型参数的猜测开始。然后接下来它会进行一个循环的3步:
EM是监督算法还是非监督算法呢?因为我们不提供已经标好的分类信息,这是个非监督学习算法。
为什么使用它?EM算法的一个关键卖点就是它的实现简单直接。另外,它不但可以优化模型参数,还可以反复的对丢失数据进行猜测。
这使算法在聚类和产生带参数的模型上都表现出色。在得知聚类情况和模型参数的情况下,我们有可能解释清楚有相同属性的分类情况和新数据属于哪个类之中。
不过EM算法也不是没有弱点…
第一,EM算法在早期迭代中都运行速度很快,但是越后面的迭代速度越慢。
第二,EM算法并不能总是寻到最优参数,很容易陷入局部最优而不是找到全局最优解。
EM算法实现可以在Weka中找到,mclustpackage里面有R语言对算法的实现,scikit-learn的gmmmodule里也有对它的实现。
6.PageRank算法
算法是做什么的?PageRank是为了决定一些对象和同网络中的其他对象之间的相对重要程度而设计的连接分析算法(linkanalysisalgorithm)。
那么什么是连接分析算法呢?它是一类针对网络的分析算法,探寻对象间的关系(也可成为连接)。
举个例子:最流行的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个创新的应用:
这算法是监督的还是非监督的?PageRank常用来发现一个网页的重要度关联度,通常被认为是一种非监督学习算法。
哪里使用过它呢?Google拥有PageRank的商标。但是斯坦福大学取得了PageRank算法的专利权。如果使用PageRank,你可能会有疑问:我不是律师,所以最好和一个真正的律师确认一下。但是只要和Google或斯坦福没有涉及到商业竞争,应该都是可以使用这个算法的。
给出PageRank的三个实现:
1C++OpenSourcePageRankImplementation
2PythonPageRankImplementation
3igraph–Thenetworkanalysispackage(R)
AdaBoost算法是做什么的?AdaBoost是个构建分类器的提升算法。
也许你还记得,分类器拿走大量数据,并试图预测或者分类新数据元素的属于的类别。
举个AdaBoost算法的例子:我们开始有3个弱学习器,我们将在一个包含病人数据的数据训练集上对他们做10轮训练。数据集里包含了病人的医疗记录各个细节。
问题来了,那我们怎么预测某个病人是否会得癌症呢?AdaBoost是这样给出答案的:
第一轮,AdaBoost拿走一些训练数据,然后测试每个学习器的准确率。最后的结果就是我们找到最好的那个学习器。另外,误分类的样本学习器给予一个比较高的权重,这样他们在下轮就有很高的概率被选中了。
再补充一下,最好的那个学习器也要给根据它的准确率赋予一个权重,并将它加入到联合学习器中(这样现在就只有一个分类器了)
第二轮,AdaBoost再次试图寻找最好的学习器。
关键部分来了,病人数据样本的训练数据现在被有很高误分配率的权重影响着。换句话说,之前误分类的病人在这个样本里有很高的出现概率。
为什么?
这就像是在电子游戏中已经打到了第二级,但当你的角色死亡后却不必从头开始。而是你从第二级开始然后集中注意,尽力升到第三级。
同样地,第一个学习者有可能对一些病人的分类是正确的,与其再度试图对他们分类,不如集中注意尽力处理被误分类的病人。
最好的学习器也被再次赋予权重并加入到联合分类器中,误分类的病人也被赋予权重,这样他们就有比较大的可能性再次被选中,我们会进行过滤和重复。
在10轮结束的时候,我们剩下了一个带着不同权重的已经训练过的联合学习分类器,之后重复训练之前回合中被误分类的数据。
这是个监督还是非监督算法?因为每一轮训练带有已经标记好数据集的弱训练器,因此这是个监督学习。
为什么使用AdaBoost?AdaBoost算法简单,编程相对来说简洁直白。
另外,它速度快!弱学习器一般都比强学习器简单,简单意味着它们的运行速度可能更快。
还有件事:
因为每轮连续的Adaboost回合都重新定义了每个最好学习器的权重,因此这是个自动调整学习分类器的非常简洁的算法,你所要做的所有事就是指定运行的