算法流程:
1。选择聚类的个数k。
2。任意产生k个聚类,然后确定聚类中心,或者直接生成k个中心。
3。对每个点确定其聚类中心点。
4。再计算其聚类新中心。
5。重复以上步骤直到满足收敛要求。(通常就是确定的中心点不再改变。
优点:
1。是解决聚类问题的一种经典算法,简单,快速
2。对处理大数据集,该算法保持可伸缩性和高效率
3。当结果簇是密集的,它的效果较好
缺点
1。在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用
2。必须事先给出k(要生成的簇的数目),而且对初值敏感,对于不同的初始值,可能会导致不同结果。
3。不适合于发现非凸形状的簇或者大小差别很大的簇
4。对躁声和孤立点数据敏感
这里为了看鸢尾花的三种聚类算法的直观区别,所以不用具体算法实现,只需要调用相应函数即可。
程序如下:
进口matplotlib。pyplot作为plt 进口numpy np 从sklearn。集群进口KMeans 从sklearn导入数据集 虹膜=datasets.load_iris () X=虹膜。数据(:,:4)# #表示我们取特征空间中的4个维度 打印(X.shape) #绘制数据分布图 plt。散射(X: 0, X (: 1), c=昂焐北昙?皁”,标签=翱吹健? plt。包含(花萼长度) plt。ylabel(萼片宽) plt.legend (loc=2) plt.show () 估计量=KMeans (n_clusters=3) #构造聚类器 estimator.fit (X) #聚类 label_pred=估计量。labels_ #获取聚类标签 #绘制k - means结果 x0=X (label_pred==0) x1=X (label_pred==1) x2=X [label_pred==2] plt。散射(x0: 0, x0 (: 1), c=昂焐北昙?皁”,标签=發abel0”) plt。散射(x1: 0, x1 (: 1), c=奥躺??”标志,标签=發abel1”) plt。散射(x2: 0, x2 (: 1), c=袄渡?标志=?”,标签=發abel2”) plt。包含(花萼长度) plt。ylabel(萼片宽) plt.legend (loc=2) plt.show ()
运行结果:
1。凝聚层次聚类:艾格尼丝算法(自底向上)
首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到某个终结条件被满足
2。分裂层次聚类:戴安娜算法(自顶向下)
首先将所有对象置于一个簇中,然后逐渐细分为越来越小的簇,直到达到了某个终结条件。
这里我选择的艾格尼丝算法。
程序如下:
从sklearn导入数据集 从sklearn。集群进口AgglomerativeClustering 进口matplotlib。pyplot作为plt 从sklearn。指标导入confusion_matrix 熊猫作为pd导入 虹膜=datasets.load_iris () irisdata=https://www.yisu.com/zixun/iris.data 集群=AgglomerativeClustering(链接=安》俊?n_clusters=3) res=clustering.fit (irisdata) 打印(“各个簇的样本数目:”) print (pd.Series (clustering.labels_) .value_counts ()) 打印(“聚类结果:”) 打印(confusion_matrix(虹膜。目标,clustering.labels_)) plt.figure () d0=irisdata[集群。labels_==0] plt。情节(d0: 0, d0 (: 1)“r”。) d1=irisdata[集群。labels_==1] plt。情节(d1: 0, d1(: 1)“走”) d2=irisdata[集群。labels_==2] plt。情节(d2: 0, d2 (: 1), b *) plt.xlabel (“Sepal.Length”) plt.ylabel (“Sepal.Width”) plt。标题(“艾格尼丝集群”) plt.show ()
运行结果:
算法:
需要两个参数:ε(eps)和形成高密度区域所需要的最少点数(minPts)
它由一个任意未被访问的点开始,然后探索这个点的,ε-邻域,如果,ε-邻域里有足够的点,则建立一个新的聚类,否则这个点被标签为杂音。注意这个点之后可能被发现在其它点的,ε-邻域里,而该,ε-邻域可能有足够的点,届时这个点会被加入该聚类中。
程序如下:
进口matplotlib。pyplot作为plt 进口numpy np 从sklearn。集群进口KMeans 从sklearn导入数据集 从sklearn。集群进口DBSCAN 虹膜=datasets.load_iris () X=虹膜。数据(:,:4)# #表示我们只取特征空间中的4个维度 打印(X.shape) #绘制数据分布图 plt。散射(X: 0, X (: 1), c=昂焐北昙?皁”,标签=翱吹健? plt。包含(花萼长度) plt。ylabel(萼片宽) plt.legend (loc=2) plt.show () dbscan=dbscan(每股收益=0.4,min_samples=9) dbscan.fit (X) label_pred=dbscan.labels_ #绘制k - means结果 x0=X (label_pred==0) x1=X (label_pred==1) x2=X [label_pred==2] plt。散射(x0: 0, x0 (: 1), c=昂焐北昙?皁”,标签=發abel0”) plt。散射(x1: 0, x1 (: 1), c=奥躺??”标志,标签=發abel1”) plt。散射(x2: 0, x2 (: 1), c=袄渡?标志=?”,标签=發abel2”) plt。包含(花萼长度) plt。ylabel(萼片宽) plt.legend (loc=2) plt.show ()python实现鸢尾花三种聚类算法(k - means,艾格尼丝,DBScan)