聚类算法

在介绍聚类算法之前,想先说说几种距离(Distance),因为不同的距离算法会影响聚类的结果。

一、距离

  1. 欧式距离

欧式距离类似于几何距离,源自欧氏空间中两点间的距离公式。二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离为

,两个N维向量a(x11,x12…x1n)与a(x21,x22…x2n)的欧式距离:

     2. 曼哈顿距离

这个距离从名字可以获悉一二,从街区A到街区B,如果中间有大楼,你不可能直接穿过去,需要绕过去,因而实际驾驶的距离就是曼哈顿距离,也成为城市街区距离。二维平面上两点a(x1,y1)与b(x2,y2)间的曼哈顿距离为,

两个N维向量的曼哈顿距离:

画图可能更加清楚,如下图所示。

     3.马氏距离

马氏距离实际上是将分布特征整合进来。

 还有其他的诸如汉明距离、闵可夫斯基距离等等参见博客

http://blog.csdn.net/shiwei408/article/details/7602324

二、聚类算法

  1. K-means算法

该方法是聚类算法中最为基础的,算法的过程如下:用户指定选择K个初始质心,即所期望聚成的簇的个数;计算其他点到这个K个质心的距离(用的欧式距离),如果P点离第n个质心的距离更近,则P点属于cluster n,所有点都采用此方法,被分为了K簇;计算同一个cluster中点向量的平均值,作为新的质心;迭代至所有质心不变为止。

具体实现的python代码参见http://www.oschina.net/code/piece_full?code=14731

该方法的缺点是将所有数据点进行指派,不识别噪音点,同时需要事先指定K值,并且不能处理异性簇,比如球形簇,不同尺寸及密度的簇,环形簇等等。

     2. 凝聚式层次聚类算法

该算法初始时,将每个点作为一个簇,每一步合并两个最接近的簇。另外即使到最后,对于噪音点或是离群点也往往还是各占一簇的,除非过度合并。对于接近程度的定义需要制定簇的近邻准则:

(1)MIN:定义簇的邻近度为不同两个簇的两个最近的点之间的距离。

(2)MAX:定义簇的邻近度为不同两个簇的两个最远的点之间的距离。

(3)组平均:定义簇的邻近度为取自两个不同簇的所有点对邻近度的平均值。

具体实现的python代码参见http://www.oschina.net/code/piece_full?code=14732

    3. DBSCAN算法

当点的分布不均匀,形状不规则是,K-means算法和凝聚式层次聚类发都将面临失效的风险,此时可以考虑采用基于密度的聚类算法:DBSCAN。算法过程如下:首先设定扫描半径EPS和扫描密度(每个数据点的密度通过对以该点为中心以边长为2*EPs的邻域内的其他数据点的个数来度量),若当前点的半径范围内密度大于等于设定密度值,则设置当前点为核心点;该点不是核心点,但是其邻域内包含至少一个核心点,则设定此点为边界点;若某点既不是核心点又不是边界点,则此点为噪声点;删除噪声点;各个核心点与其邻域内的所有核心点放在同一个簇中,把边界点跟其邻域内的某个核心点放在同一个簇中。

具体实现的python代码参见http://www.oschina.net/code/piece_full?code=14734

 

以上写的都是参考下面两位大神的博客,加上自己的一点理解啦,还有什么brich算法(一种能够高效处理大数据聚类的基于树的层次聚类算法),希望我以后有机会能接触用到~

参考博客:

http://www.ibm.com/developerworks/cn/analytics/library/ba-1607-clustering-algorithm/index.html

http://blog.sina.com.cn/s/blog_62186b460101ard2.html

 

 

 

 

posted @ 2016-08-06 16:46  fionaplanet  阅读(559)  评论(0)    收藏  举报