聚类算法
在介绍聚类算法之前,想先说说几种距离(Distance),因为不同的距离算法会影响聚类的结果。
一、距离
- 欧式距离
欧式距离类似于几何距离,源自欧氏空间中两点间的距离公式。二维平面上两点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
二、聚类算法
- 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

浙公网安备 33010602011771号