关于聚类算法Kmeans/K-mediods/层次聚类/OPTICS较为详细的介绍
来源:互联网 发布:aws没有centos 编辑:程序博客网 时间:2024/04/29 07:59
K-means算法
将一群物理对象或者抽象对象的划分成相似的对象类的过程。其中类簇是数据对象的集合,在类簇中所有的对象都彼此相似,而类簇与类簇之间的对象是彼此相异。1)
2)
3)
4)
5)
6)
7)
8)
9)
一般情况,聚类算法可以划分为以下几类:划分方法(partitioning method)、层次方法(hierarchical methods)、基于密度的方法(density-based methods)、基于网格的方法(grid-based methods)、基于模型的方法(model-based methods).k-means算法属于划分方法中的一种。
K-means算法的整个流程:首先从聚类对象中随机选出K个对象作为类簇的质心(当然了,初始参数的K代表聚类结果的类簇数),对剩余的每个对象,根据它们分别到这个K个质心的距离,将它们指定到最相似的簇(因为K-means是利用距离来量化相似度的,所以我们这里可以理解为是“将它们指定到离最近最近距离的质心所属类簇”)。然后重新计算质心位置。以上过程不断反复,直到准则函数收敛为止。通常采用平方误差准则,定义如下:
其中,E代表的意思是所有类簇中各对象到其所属类簇质点平方误差和.
K:聚类结果类簇个数
Ci:第i个类簇
P:类簇中聚类对象
mi:第i个类簇的质心
K-means的优点和不足:能处理大型数据集,结果簇相当紧凑,并且簇和簇之间明显分离。计算复杂性O(tkn) t:迭代次数、K :聚类数 n:样本数;但是
1)该算法必须事先给定类簇数和质点,簇数和质点的初始值设定往往会对聚类的算法影响较大。
2 ) 通常会在获得一个局部最优值时停止,
3 ) 并且只适合对数值型数据聚类,
4) 只适用于聚类结果为凸形的数据集,K-means方法不适合发现非凸面形状的类簇,或者大小差别很大的簇。
5) 对“噪音”和孤立点数据敏感,少量的该类数据对质点的计算会产生极大的影响。
关于K-means的代码实现网上有很多。
K中心点算法(K-medoids)
前面介绍了k-means算法,并列举了该算法的缺点。而K中心点算法(K-medoids)正好能解决k-means算法中的 “噪声”敏感这个问题。
如何解决的呢?
首先,我们得介绍下k-means算法为什么会对“噪声”敏感。还记得K-means寻找质点的过程吗?对某类簇中所有的样本点维度求平均值,即获得该类簇质点的维度。当聚类的样本点中有“噪声”(离群点)时,在计算类簇质点的过程中会受到噪声异常维度的干扰,造成所得质点和实际质点位置偏差过大,从而使类簇发生“畸变”。
Eg: 类簇C1中已经包含点A(1,1)、B(2,2)、 C(1,2)、 D(2,1), 假设N(100,100)为异常点,当它纳入类簇C1时,计算质点Centroid((1+2+1+2+100)/5,(1+2+2+1+100)/5)=centroid(21,21),此时可能造成了类簇C1质点的偏移,在下一轮迭代重新划分样本点的时候,将大量不属于类簇C1的样本点纳入,因此得到不准确的聚类结果。
为了解决该问题,K中心点算法(K-medoids)提出了新的质点选取方式,而不是简单像k-means算法采用均值计算法。在K中心点算法中,每次迭代后的质点都是从聚类的样本点中选取,而选取的标准就是当该样本点成为新的质点后能提高类簇的聚类质量,使得类簇更紧凑。该算法使用绝对误差标准来定义一个类簇的紧凑程度。
如果某样本点成为质点后,绝对误差能小于原质点所造成的绝对误差,那么K中心点算法认为该样本点是可以取代原质点的,在一次迭代重计算类簇质点的时候,我们选择绝对误差最小的那个样本点成为新的质点。
Eg:样本点A –>E1=10
样本点B –>E2=11
样本点C –>E3=12
原质点O–>E4=13,那我们选举A作为类簇的新质点。
与K-means算法一样,K-medoids也是采用欧几里得距离来衡量某个样本点到底是属于哪个类簇。终止条件是,当所有的类簇的质点都不在发生变化时,即认为聚类结束。
Java实现代码如下:
package com.kmedoids;
import java.util.ArrayList;
public class Cluster {
}
------------------------------------
package com.kmedoids;
import java.util.ArrayList;
public class DataPoint {