1、Kmeans实战实战聚类算法简介聚类算法简介Kmeans算法详解算法详解Kmeans算法的缺陷及若干改进算法的缺陷及若干改进 Kmeans的单机实现与分布式实现策略的单机实现与分布式实现策略 123聚类的目标:聚类的目标:将一组向量分成若干组,组内数据是相似的,将一组向量分成若干组,组内数据是相似的,而组间数据是有较明显差异。而组间数据是有较明显差异。与分类区别:与分类区别:分类与聚类最大的区别在于分类的目标事先已分类与聚类最大的区别在于分类的目标事先已知,聚类也被称为无监督机器学习知,聚类也被称为无监督机器学习聚类手段:传统聚类算法聚类手段:传统聚类算法 划分法划分法 层次方法层次方法 基于
2、密度基于密度方法方法 基于网络方法基于网络方法 基于模型方法基于模型方法Q1:K是什么?是什么?A1:k是聚类算法当中类的个数。是聚类算法当中类的个数。Summary:Kmeans是用均值算法把数是用均值算法把数据分成据分成K个类的算法!个类的算法! Q2:means是什么?是什么?A2:means是均值算法。是均值算法。步骤一:取得步骤一:取得k个初始初始中心点个初始初始中心点Min of threedue to the EuclidDistance步骤二:把每个点划分进相应的簇步骤二:把每个点划分进相应的簇Min of threedue to the EuclidDistance步骤三:重
3、新计算中心点步骤三:重新计算中心点步骤四:迭代计算中心点步骤四:迭代计算中心点步骤五:收敛步骤五:收敛从数据中随机抽取从数据中随机抽取k个点作为初始聚类的个点作为初始聚类的中心,由这个中心代表各个聚类中心,由这个中心代表各个聚类计算数据中所有的点到这计算数据中所有的点到这k个点的距离,个点的距离,将点归到离其最近的聚类里将点归到离其最近的聚类里调整聚类中心,即将聚类的中心移动到调整聚类中心,即将聚类的中心移动到聚类的几何中心(即平均值)处,也就是聚类的几何中心(即平均值)处,也就是k-means中的中的mean的含义的含义重复第重复第2步直到聚类的中心不再移动,此步直到聚类的中心不再移动,此时
4、算法收敛时算法收敛最后最后kmeans算法时间、空间复杂度是:算法时间、空间复杂度是:时间复杂度:上限为时间复杂度:上限为O(tKmn),下限为,下限为(Kmn)其中,)其中,t为迭代次数,为迭代次数,K为簇的数为簇的数目,目,m为记录数,为记录数,n为维数为维数 空间复杂度:空间复杂度:O(m+K)n),其中,其中,K为簇为簇的数目,的数目,m为记录数,为记录数,n为维数为维数Input & centroidsSelected kMaxIterations & ConvergenceMeassures数据的采集和抽象初始的中心选择最大迭代次数收敛值 k值的选定 度量距离的手段factors?
5、初始中初始中心点心点输入的数输入的数据及据及K值值的选择的选择距离度距离度量量我们主要研究的三个方面因素。我们主要研究的三个方面因素。讨论初始中心点意义何在?下面的例子一目了然吧?讨论初始中心点意义何在?下面的例子一目了然吧?初始中心点初始中心点收敛后收敛后你你懂懂的的 在进一步阐述初始中心点选择在进一步阐述初始中心点选择之前,我们应该先确定度量之前,我们应该先确定度量kmeans的算法精确度的方法。的算法精确度的方法。一种度量聚类效果的标准是:一种度量聚类效果的标准是:SSE(Sum of Square Error,误差平方和误差平方和)SSE越小表示数据点越接近于越小表示数据点越接近于它们
6、的质心,聚类效果也就越它们的质心,聚类效果也就越好。因为对误差取了平方所以好。因为对误差取了平方所以更重视那些远离中心的点。更重视那些远离中心的点。一种可以肯定降低一种可以肯定降低SSE的方法的方法是增加簇的个数。但这违背了是增加簇的个数。但这违背了聚类的目标。因为聚类是在保聚类的目标。因为聚类是在保持目标簇不变的情况下提高聚持目标簇不变的情况下提高聚类的质量。类的质量。现在思路明了了我们首先以缩现在思路明了了我们首先以缩小小SSE为目标改进算法。为目标改进算法。为了克服为了克服k均值算法收敛于局部的问题,提出了二分均值算法收敛于局部的问题,提出了二分k均值算法。该算法首先将所有的点作为一个簇
7、,然后均值算法。该算法首先将所有的点作为一个簇,然后将该簇一分为二。之后选择其中一个簇继续划分,选将该簇一分为二。之后选择其中一个簇继续划分,选择哪个簇进行划分取决于对其划分是否可以最大程度择哪个簇进行划分取决于对其划分是否可以最大程度降低降低SSE值。值。伪代码如下:伪代码如下:将所有的点看成一个簇将所有的点看成一个簇当簇数目小于当簇数目小于k时时对于每一个簇对于每一个簇计算总误差计算总误差在给定的簇上面进行在给定的簇上面进行K均值聚类均值聚类(K=2)计算将该簇一分为二后的总误差计算将该簇一分为二后的总误差选择使得误差最小的那个簇进行划分操作选择使得误差最小的那个簇进行划分操作既然是改进算
8、法就要体现改既然是改进算法就要体现改进算法的优越性。为此控制进算法的优越性。为此控制变量,在相同的实验环境下,变量,在相同的实验环境下,取相同的取相同的k值取。值取。选取相同的的距离度量标选取相同的的距离度量标准(欧氏距离)准(欧氏距离)在相同的数据集下进行测在相同的数据集下进行测试。试。一组不好的初始点产生的一组不好的初始点产生的Kmeans算法结果算法结果二分二分kmeans产生的结果产生的结果要强调的是尽管只是这一组实验不得以得出二分要强调的是尽管只是这一组实验不得以得出二分kmeans的的优越性,优越性,但是但是经过大量实验得出的结论却是在大多数情况下经过大量实验得出的结论却是在大多数
9、情况下二分二分kmeans确实优于朴素的确实优于朴素的kmeans算法。算法。二分二分kmeans真真的能使的能使SSE达达到全局最小值到全局最小值吗?吗?从前面的讲解可以看到二分从前面的讲解可以看到二分kmeans算法的思想有点类算法的思想有点类似于贪心思想。但是我们会似于贪心思想。但是我们会发现贪心的过程中有不确定发现贪心的过程中有不确定的因素比如:二分一个聚类的因素比如:二分一个聚类时选取的两个中间点是随机时选取的两个中间点是随机的,这会对我们的策略造成的,这会对我们的策略造成影响。那么如此一来二分影响。那么如此一来二分kmeans算法会不会达到全算法会不会达到全局最优解呢?答案是:会!
10、局最优解呢?答案是:会!尽管你可能惊诧于下面的说尽管你可能惊诧于下面的说法,但全局最小值的定义却法,但全局最小值的定义却是:是:可能可能的最好结果。的最好结果。 讨论讨论k值、剔除坏点的意义何在?下面以一个例值、剔除坏点的意义何在?下面以一个例子来说明子来说明k值的重要性。值的重要性。上面的例子当中出错的原因上面的例子当中出错的原因很明显。凭直觉我们很容易很明显。凭直觉我们很容易知道不可能有这样的天气知道不可能有这样的天气它的气温是它的气温是100,湿度,湿度是是1100%。可见坏点对。可见坏点对kmeans的影响之大。另一的影响之大。另一方面,季节有春夏秋冬之分,方面,季节有春夏秋冬之分,而
11、我们强行的把它们分为夏而我们强行的把它们分为夏冬两个类也是不太合理的。冬两个类也是不太合理的。如果分为四个类我们也许可如果分为四个类我们也许可以以“中和中和”掉坏点的影响。掉坏点的影响。究竟哪里错究竟哪里错了!了!(1)将数据集向量化得到一个)将数据集向量化得到一个list后放后放入内存,选择两个距离阈值:入内存,选择两个距离阈值:T1和和T2。 (2)从)从list中任取一点中任取一点P,用低计算成,用低计算成本方法快速计算点本方法快速计算点P与所有与所有Canopy之之间的距离(如果当前不存在间的距离(如果当前不存在Canopy,则把点则把点P作为一个作为一个Canopy),如果点),如果
12、点P与某个与某个Canopy距离在距离在T1以内,则将点以内,则将点P加入到这个加入到这个Canopy; (3)如果点)如果点P曾经与某个曾经与某个Canopy的距的距离在离在T2以内,则需要把点以内,则需要把点P从从list中删中删除,这一步是认为点除,这一步是认为点P此时与这个此时与这个Canopy已经够近了,因此它不可以再已经够近了,因此它不可以再做其它做其它Canopy的中心了;的中心了; (4)重复步骤)重复步骤2、3,直到,直到list为空结为空结束束 Canopy预处理这么好,预处理这么好,我们以后就用它好了!我们以后就用它好了!我看不见得,它虽然解决我看不见得,它虽然解决kme
13、ans当中的一些问题,当中的一些问题,但其自身也引进了新的问题:但其自身也引进了新的问题:t1、t2的选取。的选取。 VS单挑单挑OR群殴群殴?!?! 面对海量数据时,传统的聚类算法存在着单位时面对海量数据时,传统的聚类算法存在着单位时间内处理量小、面对大量的数据时处理时间较长、间内处理量小、面对大量的数据时处理时间较长、难以达到预期效果的缺陷以上算法都是假设数据都难以达到预期效果的缺陷以上算法都是假设数据都是在内存中存储的,是在内存中存储的,随着数据集的增大,基于内存随着数据集的增大,基于内存的就难以适应的就难以适应是一个为并行处理大量数据而设计的编程模型。是一个为并行处理大量数据而设计的编
14、程模型。 Kmeans算法都是假设数据都是在内存中存储的,算法都是假设数据都是在内存中存储的,随着数据集的增大,基于内存的就难随着数据集的增大,基于内存的就难以适应是一个为并行处理大以适应是一个为并行处理大量数据而设计的编程模型,它将工作划分为独立任量数据而设计的编程模型,它将工作划分为独立任务组成的集合。务组成的集合。函数的设计函数的设计框架中框架中 函数函数的输入为的输入为,对,其对,其中:为输入数据记录的偏移量;中:为输入数据记录的偏移量;为当前样本的各维坐标值组成的为当前样本的各维坐标值组成的向量向量首先计算该向量到各个聚簇中心点的距离,首先计算该向量到各个聚簇中心点的距离,然后选择最
15、小的距离的聚簇作为该样本所然后选择最小的距离的聚簇作为该样本所属的簇,之后输出属的簇,之后输出,其中,其中是距最近的聚簇的标是距最近的聚簇的标识符,识符,为表示该样本的向为表示该样本的向量量函数的设计函数的设计函数的输入为函数的输入为,对,即函数的输出首先,对,即函数的输出首先,从中解析出各个向量,然后从中解析出各个向量,然后将解析出的向量相加并记录集合中向量将解析出的向量相加并记录集合中向量的个数输出是的个数输出是,对,其中:对,其中:是聚簇的标是聚簇的标识符;识符;是以上集合中所有是以上集合中所有的向量相加所得的向量及集合中向量的的向量相加所得的向量及集合中向量的数目数目函数的输入是函数的
16、输入是,键值对,其中:为聚簇的键值对,其中:为聚簇的标识符;为节点处理的聚标识符;为节点处理的聚簇中含有的样本的个数及用向量表示的聚簇的簇中含有的样本的个数及用向量表示的聚簇的中心点输出为中心点输出为,对,其中:对,其中:为为聚簇的标识符;聚簇的标识符;为新的聚簇中为新的聚簇中心函数首先从函数的输入中解心函数首先从函数的输入中解析出属于同一个聚簇的样本的个数及各个析出属于同一个聚簇的样本的个数及各个节点传过来的,然后节点传过来的,然后将个数及各个相加,之将个数及各个相加,之后将所得到的向量除以个数得到新的中心点坐后将所得到的向量除以个数得到新的中心点坐标。标。所有实验都是在实验室搭建的平台所有
17、实验都是在实验室搭建的平台上运行的平台有上运行的平台有 台机器,都是四核台机器,都是四核处理器,内存处理器,内存版本,版本,版本每台机器之间用千版本每台机器之间用千兆以太网兆以太网卡,通过交换机连接实验所用的数据是人工数卡,通过交换机连接实验所用的数据是人工数据,维度是维为了测试算法的性能,实验据,维度是维为了测试算法的性能,实验中构中构造了分别含有造了分别含有104,105,106,2*106 条条记录的数据来进行测试由于算法记录的数据来进行测试由于算法中有中有随机初始化中心点的操作,因此对每一组实验重随机初始化中心点的操作,因此对每一组实验重复执行次,取其平均执行时间作为最终实验复执行次,
18、取其平均执行时间作为最终实验结结果果可以看出:基于可以看出:基于的算法的算法的运行效率要远远高于传统的的运行效率要远远高于传统的算法算法p 经常不断地学习,你就什么都知道。你知道得越多,你就越有力量p Study Constantly, And You Will Know Everything. The More You Know, The More Powerful You Will Be学习总结结束语当你尽了自己的最大努力时,失败也是伟大的,所以不要放弃,坚持就是正确的。When You Do Your Best, Failure Is Great, So DonT Give Up, Stick To The End演讲人:XXXXXX 时 间:XX年XX月XX日