SparkMLlib学习报告kmeans算法.docx
《SparkMLlib学习报告kmeans算法.docx》由会员分享,可在线阅读,更多相关《SparkMLlib学习报告kmeans算法.docx(10页珍藏版)》请在冰豆网上搜索。
![SparkMLlib学习报告kmeans算法.docx](https://file1.bdocx.com/fileroot1/2022-12/14/e4a6d24e-b473-4a71-9748-4a35aba7a225/e4a6d24e-b473-4a71-9748-4a35aba7a2251.gif)
SparkMLlib学习报告kmeans算法
SparkMLlib学习报告
K-Means算法分析及应用
1.引言
随着大数据相关技术产业的逐步成熟,各种云计算、大数据技术发展迅速,其中由加州大学伯克利分校AMP实验室(Algorithms,Machines,andPeopleLab)开发的Spark技术,以集大成的技术优势成为继Hadoop之后当今大数据领域极为活跃和热门的高效大数据通用计算平台。
Spark技术体系基于RDD数据结构成功构建起一体化、多元化的大数据处理体系,在“OneStackToRuleThemAll”思想的引领下,Spark成功使用SparkSQL、SparkStreaming、MLLib、GraphX近乎完美解决了大数据中的BatchProcessing、StreamingProcessing、Ad-hocQuery等三大核心问题。
在Spark中SparkSQL、SparkStreaming、MLLib、GraphX四大框架和库之间可以无缝的共享数据和操作,这是其它大数据平台都无可匹敌的优势。
从SparkSummit上的信息看,目前Spark已获得世界多家顶级公司的支持,其中就包括Intel、IBM等,同时最大的四个Hadoop发行商都提供对Spark非常强有力的支持。
MLlib是Spark对常用机器学习算法的实现库,同时包括相关的测试和数据生成器。
MLlib采用高效迭代式、内存存储的分析计算,使得数据的计算处理速度大大高于普通的数据处理引擎,它目前支持四种常见的机器学习问题:
二元分类,回归,聚类以及协同过滤,同时也包括一个底层的梯度下降优化基础算法。
本文将详细介绍和分析SparkMLLib聚类分析算法中的K-Means算法,并用实际算例测试算法的性能和智能化表现。
2.机器学习及MLLib算法库
在维基百科上对机器学习提出以下几种定义:
●机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能;
●机器学习是对能通过经验自动改进的计算机算法的研究;
●机器学习是用数据或以往的经验,以此优化计算机程序的性能标准;
可以看出机器学习强调三个关键词:
算法、经验、性能,即机器学习是数据通过算法构建出模型并对模型进行评估,若评估的性能达到要求,就拿这个模型来测试其他的数据,否则达不到要求就要调整算法来重新建立模型,再次进行评估,如此循环往复,最终获得满意的经验来处理其他数据的过程。
2.1.机器学习分类
通常机器学习可分为监督学习,无监督学习,半监督学习和强化学习四类。
监督是从给定训练数据集中学习一个函数(模型),当新数据到来时,可以根据这个函数(模型)预测结果。
其训练集要求包括输入和输出,也可以说是特征和目标。
训练集中的目标是由人标注的。
常见的监督学习算法包括回归分析和统计分类(包括二元分类和多元分类)。
与监督学习相比,无监督学习的训练集没有人为标注的结果,学习模型是为了推断出数据的一些内在结构。
常见的应用场景包括关联规则学习以及聚类分析等。
常见算法包括Apriori算法和K-Means算法。
其学习目标是我们不告诉计算机怎么做,而是让计算机自己去学习怎样做一些事情。
半监督学习是介于监督学习与无监督学习之间的一种机器学习方式,主要考虑如何利用少量的标注样本和大量的未标注样本进行训练和分类的问题。
半监督学习对于减少标注代价,提高学习机器性能具有常重大的实际意义。
主要算法有:
基于概率的算法、在现有监督算法基础上进行修改的方法、直接依赖于聚类假设的方法等。
强化学习通过观察来学习动作的完成,每个动作都会对环境有所影响,学习对象根据观察到的周围环境的反馈来做出判断。
在这种学习模式下,输入数据是作为对模型的反馈,而不像监督模型那样,输入数据仅仅是作为一个检查模型对错的方式,在强化学习下,输入数据直接反馈到模型,模型必须对此立刻做出调整。
常见的应用场景包括动态系统以及机器人控制等。
常见算法包括Q-Learning以及时间差学习。
2.2.MLLib算法库
MLlib目前支持4种常见的机器学习问题:
分类、回归、聚类和协同过滤,MLlib在Spark整个生态系统中的位置如图下图2-1所示:
图2-1Spark生态系统图
分类算法属于监督式学习,使用类标签已知的样本建立分类函数或分类模型,再应用分类模型把数据库中类标签未知的数据进行归类。
分类在数据挖掘中是一项重要任务,目前在商业上应用最多,常见典型应用场景有流量预测、精确营销、客户获取、个性偏好等。
MLlib目前支持的分类算法有:
逻辑回归、支持向量机、朴素贝叶斯和决策树。
回归算法属于监督式学习,每个个体都有一个与之相关联的实数标签,并且我们希望在给出用于表示这些实体的数值特征后,所预测出的标签值可以尽可能接近实际值。
MLlib目前支持回归算法有:
线性回归、岭回归、Lasso和决策树。
聚类算法属于无监督式学习,通常被用于探索性分析,是根据“物以类聚”的原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并对每一个这样的簇进行描述的过程。
它的目的是使得属于同一簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似,常见的典型应用场景有客户细分、客户研究、市场细分、价值评估。
MLlib目前支持广泛使用的K-Mmeans聚类算法。
协同过滤常被应用于推荐系统,这些技术旨在补充用户-商品关联矩阵中所缺失的部分。
MLlib当前支持基于模型的协同过滤,其中用户和商品通过一小组隐语义因子进行表达,并且这些因子也用于预测缺失的元素。
3.K-Mmeans算法分析
聚类分析是一个无监督学习过程,一般是用来对数据对象按照其特征属性进行分组,经常被应用在客户分群,欺诈检测,图像分析等领域。
K-Means算法是最有名并且最经常使用的聚类算法,其原理比较容易理解,并且聚类效果良好,有着广泛使用。
和诸多机器学习算法一样,K-Means算法也是一个迭代式算法,其主要流程如下图3-1所示:
图3-1K-Means算流程图
在K-Means算法中,衡量距离一般有多个函数可以选择,最常用的是欧几里得距离,也叫欧式距离。
公式如下式
(1):
…………………………
(1)
(其中C代表中心点,X代表任意一个非中心点)
在实际应用中,K-Means算法有两个不得不面对并且克服的问题:
1)聚类个数K的选择;
2)初始聚类中心点的选择。
3.1.K的选择
由于聚类算法是无监督学习,K的选择是一个比较有学问和讲究的步骤,事实上K应该取决于数据的内在结构。
SparkMLlib在KMeansModel类里提供了computeCost方法,该方法通过计算所有数据点到其最近的中心点的平方和来评估聚类的效果。
为了测试该算法的执行效果,设计一组具有明显分组倾向的数据,设计算法对不同的K值分别进行训练并对训练得到KMeansModel对象调用computeCost方法,观察computeCost方法的执行结果,并进行分析。
用MATLAB生成如下图3-2所示测试数据,可以看出该数据明显具有分为4组的倾向。
图3-2测试数据分布图
设计算法对K取2、3、4、5、6、7、8、9、10、11、12时,分别进行训练建模,并对训练得到KMeansModel对象调用computeCost方法,代码如下3-3截图所示:
图3-3测试代码截图
当K分别取2、3、4、5、6、7、8、9、10、11、12时,computeCost方法的计算结果如下图3-4所示:
图3-4computeCost方法计算结果图
可以看出,正常情况下K越大,computeCost方法计算结果就越小,这是显而易知的。
但是结果显示在K=3和K=4时computeCost方法计算结果的下降趋势是最大的,这正是因为数据分组的明显倾向性所致,因此该测试数据合理的K取值应该为3或4。
一般来说,同样的迭代次数和算法运行次数,computeCost结果值越小代表聚类效果越好。
但在实际应用中,还需要考虑到聚类结果的可解释性,不能一味选择使computeCost结果值最小的那个K。
3.2.初始聚类中心的选择
K-Means算法中选择不同的初始聚类中心可能导致聚类结果的差异。
SparkMLlibK-means算法的实现在初始聚类点的选择上,借鉴了一个K-Means并行化演化版本K-means||的类K-means++实现。
K-means++算法在初始点选择上遵循一个基本原则:
初始聚类中心点相互之间的距离应该尽可能远,其基本步骤为:
●Step1:
从数据集X中随机选择一个点作为第一个初始点;
●Step2:
计算数据集中所有点与最新选择的中心点的距离D(x);
●Step3:
选择下一个中心点,使得
最大;
●Step4:
重复Step2、Step3过程,直到K个初始点选择完成。
3.3.K-Means算法参数分析
SparkMLlib中K-Means算法的实现类(KMeans.scala)具有以下参数,类声明如下:
1.classKMeansprivate(
2.privatevalk:
scala.Int,
3.privatevalmaxIterations:
scala.Int,
4.privatevalruns:
scala.Int,
5.privatevalinitializationMode:
scala.Predef.String,
6.privatevalinitializationSteps:
scala.Int,
7.privatevalepsilon:
scala.Double,
8.privatevalseed:
scala.Long)
9.extendsscala.AnyRefwithscala.Serializablewithorg.apache.spark.Logging
各参数的含义解释如下:
●k表示期望的聚类个数;
●maxInterations表示方法单次运行最大的迭代次数;
●runs表示算法被运行的次数,K-means算法不保证能返回全局最优的聚类结果,所以在目标数据集上多次运行K-means算法,有助于返回最佳聚类结果;
●initializationMode表示初始聚类中心点的选择方式,目前支持随机选择或者K-means||方式,默认是K-means||;
●initializationSteps表示K-means||方法中的步数;
●epsilon表示K-means算法迭代收敛的阀值;
●seed表示集群初始化时的随机种子。
通常应用时,我们都会先调用KMeans.train方法对数据集进行聚类训练,这个方法会返回KMeansModel类实例,然后我们也可以使用KMeansModel.predict方法对新的数据点进行所属聚类的预测,这是非常实用的功能。
KMeans.train方法有很多重载方法,这里我们选择参数最全的一个展示:
1.deftrain(
2.data:
org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector],
3.k:
scala.Int,
4.maxIterations:
scala.Int,
5.runs:
scala.Int,
6.initializationMode:
scala.Predef.String,
7.seed:
scala.Long):
8.org.apache.spark.mllib.clustering.KMeansModel={/*compiledcode*/}
KMeansModel.predict方法接受不同的参数,可以是向量,或者RDD,返回的是输入参数所属聚类的索引号。
声明如下:
●defpredict(point:
org.apache.spark.mllib.linalg.Vector):
scala.Int={/*compiledcode*/}
●defpredict(points:
rg.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector]):
org.apache.spark.rdd.RDD[scala.Int]={/*compiledcode*/}
通过上面的分析,我们就可以完成一次聚类分析从模型训练到聚类预测的全过程。
4.K-Mmeans算法实践
下面我们将用K-Means算法对实际测试数据进行聚类分析。
我们用的目标数据集是来自UCIMachineLearningRepository的WholesalecustomerDataSet。
UCI是一个关于机器学习测试数据的下载中心站点,里面包含了适用于做聚类,分群,回归等各种机器学习问题的数据集。
WholesalecustomerDataSet是引用某批发经销商的客户在各种类别产品上的年消费记录。
为方便处理,本实验把原始CSV数据文件拆分成两个CSV文本文件并删除了数据文件首行的列名称数据,分别用于训练和测试。
客户消费数据格式如下图4-1所示:
图4-1客户消费数据格式预览图
数据每一列的含义如下图4-2所示:
图4-2客户消费数据属性说明图
在本例中,根据目标客户的消费数据,将每一列视为一个特征指标,对数据进行聚类分析,代码实现如下图4-3:
图4-3聚类分析代码截图
执行后得到的聚类中心结果如下图4-4所示:
图4-4聚类中心执行结果图
执行后得到的预测结果如下图4-5所示(部分结果):
图4-5聚类预测执行结果图
上述算例中将训练数据分为8组,因为在做聚类分析之前先用图3-3所示测试代码对训练数据进行了分组测试,结果如下图4-6所示:
图4-6训练数据分组测试结果图
从图4-6的运行结果可以看到,当K=9时,computeCost结果值有波动,但是后面又逐渐减小了,所以选择8这个临界点作为K的个数。
多运行几次,就会发现结果不是稳定的,但大概临界位置在8、9、10、11四个值之间,可以通过多次测试找到一个相对稳定的K值。
理论上K的值越大,聚类的computeCost结果值越小,极限情况下,每个点都是一个聚类中心点,这时候computeCost结果为0,但是显然这不是一个具有实际意义的聚类结果。
因此对具体的训练数据还应当根据聚类的实际意义考量聚类组数。
可以看出算法程序对训练数据建立聚类模型获得了8个聚类中心点,进而又对测试数据进行了合理的聚类预测,从而完成一次完成的聚类分析过程。
聚类分析的智能性体现在无监督学习上,即我们没有告诉算法如何聚类,算法会自主通过学习过程分析数据内在结构,从而获得指定数目的聚类中心,进而对预测数据进行聚类预测,整个过程不需要人工干涉,算法会自行完成建模和预测的所有过程。
5.展望
本文简单介绍了Spark的机器学习库,并且具体分析其中K-Means算法的基本原理,以及基于实际数据进行了聚类分析。
在实际应用中机器学习应用的构建是一个复杂的过程,通常还需要对数据进行预处理,然后特征提取以及数据清洗等,最后才能利用算法来分析数据。
SparkMLlib不仅提供简单易用的API,更重要的是Spark在处理大数据上具有高效性以及在迭代计算时具有独特优势。
本文所采用的测试数据集很小,并且分配在本地运行,并不能反映大数据的应用场景,但是可以在此基本原理上轻松将本文的测试程序推广到大数据集群机器学习应用场景中,因为SparkMLlib的编程模型都是一致的,无非是数据读取和处理的方式略有不同。
相信在将来的大数据时代,SparkMLlib必将有更多广泛而实际的应用。
6.参考资料
[1]Spark官方文档翻译.吴洪泽
[2]XX百科.SPARK词条
[3]
[4]UCIMachineLearningRepository.WholesalecustomerDataSet