机器学习笔记(4)——聚类之BIRCH

一、算法介绍

层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。创建聚类树有自下而上合并和自上而下分裂两种方法。

 层次聚类使用欧式距离来计算不同类别数据点间的距离(相似度)。

      

Java中的层次聚类 层次聚类算法实现_相似度

二、算法流程

1.凝聚层次聚类:AGNES算法(自底向上)

 首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到某个终结条件被满足。绝大多数层次聚类方法属于这一类。

          层次聚类的合并算法通过计算两类数据点间的相似性,对所有数据点中最为相似的两个数据点进行组合,并反复迭代这一过程。数据点之间的距离来确定它们之间的相似性,距离越小,相似度越高。并将距离最近的两个数据点或类别进行组合,生成聚类树。

Java中的层次聚类 层次聚类算法实现_聚类_02

2.分裂层次聚类:DIANA算法(自顶向下)

   首先将所有对象置于一个簇中,然后逐渐细分为越来越小的簇,直到达到了某个终结条件。例如,达到某个希望的簇的数目,或者两个最近的簇之间的距离超过了某个阀值。

 

三、算法优缺点

层次聚类法的优点:

可以通过设置不同的相关参数值,得到不同粒度上的多层次聚类结构;在聚类形状方面,层次聚类适用于任意形状的聚类,并且对样本的输入顺序是不敏感的。 
 

层次聚类的不足之处:

算法的时间复杂度大,层次聚类的结果依赖聚类的合并点和分裂点的选择。并且层次聚类过程最明显的特点就是不可逆性,由于对象在合并或分裂之后,下一次聚类会在前一次聚类基础之上继续进行合并或分裂,也就是说,一旦聚类结果形成,想要再重新合并来优化聚类的性能是不可能的了。聚类终止的条件的不精确性是层次聚类的另一个缺点,层次聚类要求指定一个合并或分解的终止条件,比如指定聚类的个数或是两个距离最近的聚类之间最小距离阈值。
 
 

四、Python实现

这里选择的AGNES算法

from sklearn import datasets
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
import pandas as pd
  
iris = datasets.load_iris()
irisdata = iris.data
  
clustering = AgglomerativeClustering(linkage='ward', n_clusters=3)
  
res = clustering.fit(irisdata)
  
print ("各个簇的样本数目:")
print (pd.Series(clustering.labels_).value_counts())
print ("聚类结果:")
print (confusion_matrix(iris.target, clustering.labels_))
  
plt.figure()
d0 = irisdata[clustering.labels_ == 0]
plt.plot(d0[:, 0], d0[:, 1], 'r.')
d1 = irisdata[clustering.labels_ == 1]
plt.plot(d1[:, 0], d1[:, 1], 'go')
d2 = irisdata[clustering.labels_ == 2]
plt.plot(d2[:, 0], d2[:, 1], 'b*')
plt.xlabel("Sepal.Length")
plt.ylabel("Sepal.Width")
plt.title("AGNES Clustering")
plt.show()
各个簇的样本数目:
0    64
1    50
2    36
dtype: int64
聚类结果:
[[ 0 50  0]
 [49  0  1]
 [15  0 35]]

Java中的层次聚类 层次聚类算法实现_层次聚类_03

Java中的层次聚类 层次聚类算法实现_Java中的层次聚类_04