python实现鸢尾花三种聚类算法(k - means,艾格尼丝,DBScan)

  

  

算法流程:

  

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 ()      

运行结果:

  

 python实现鸢尾花三种聚类算法(k - means,艾格尼丝,DBScan)

  

  

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 ()      

运行结果:

  

 python实现鸢尾花三种聚类算法(k - means,艾格尼丝,DBScan)

  

  

算法:   

需要两个参数:ε(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)