机器学习 - 层次聚类



层次聚类是另一种无监督学习算法,用于将具有相似特征的未标记数据点分组在一起。层次聚类算法分为以下两类:

  • 凝聚层次算法 - 在凝聚层次算法中,每个数据点都被视为单个集群,然后依次合并或凝聚(自下而上方法)成对的集群。集群的层次结构表示为树状图或树结构。

  • 分裂层次算法 - 另一方面,在分裂层次算法中,所有数据点都被视为一个大的集群,聚类过程涉及将一个大的集群划分为各种小的集群(自上而下方法)。

执行凝聚层次聚类的步骤

我们将解释最常用和最重要的层次聚类,即凝聚聚类。执行此操作的步骤如下:

  • 步骤 1 - 将每个数据点视为单个集群。因此,我们开始时将有 K 个集群。数据点的数量开始时也为 K。

  • 步骤 2 - 在此步骤中,我们需要通过连接两个最接近的数据点来形成一个大的集群。这将导致总共 K-1 个集群。

  • 步骤 3 - 现在,为了形成更多集群,我们需要连接两个最接近的集群。这将导致总共 K-2 个集群。

  • 步骤 4 - 现在,为了形成一个大的集群,重复上述三个步骤,直到 K 变为 0,即没有更多的数据点可以连接。

  • 步骤 5 - 最后,在形成一个大的集群后,将使用树状图根据问题将其划分为多个集群。

树状图在凝聚层次聚类中的作用

正如我们在最后一步中讨论的那样,一旦形成大的集群,树状图的作用就开始了。树状图将用于根据我们的问题将集群分割成多个相关数据点的集群。这可以通过以下示例来理解:

示例 1

为了理解,让我们从导入所需的库开始:

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

接下来,我们将绘制本例中使用的数点:

X = np.array([[7,8],[12,20],[17,19],[26,15],[32,37],[87,75],[73,85],
[62,80],[73,60],[87,96],])
labels = range(1, 11)
plt.figure(figsize=(10, 7))
plt.subplots_adjust(bottom=0.1)
plt.scatter(X[:,0],X[:,1], label='True Position')

for label, x, y in zip(labels, X[:, 0], X[:, 1]):
   plt.annotate(label,xy=(x, y), xytext=(-3, 3),textcoords='offset points', ha='right', va='bottom')
plt.show() 

输出

执行此代码时,它将生成以下绘图作为输出:

Hierarchical Clustering

从上图可以很容易地看出,我们的数据点中有两个集群,但在现实世界的数据中,可能有数千个集群。

接下来,我们将使用 Scipy 库绘制数据点的树状图:

from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt
linked = linkage(X, 'single')
labelList = range(1, 11)
plt.figure(figsize=(10, 7))

dendrogram(linked, orientation='top',labels=labelList,
distance_sort='descending',show_leaf_counts=True)

plt.show() 

它将生成以下绘图:

Longest Vertical Distance

现在,一旦形成大的集群,就选择最长的垂直距离。然后绘制一条垂直线穿过它,如下图所示。由于水平线在两点与蓝线相交,因此集群数量将为两个。

Longest Vertical_Distance Selected

接下来,我们需要导入用于聚类的类并调用其fit_predict方法来预测集群。我们正在导入sklearn.cluster库的AgglomerativeClustering类:

from sklearn.cluster import AgglomerativeClustering

cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean',
linkage='ward')

cluster.fit_predict(X) 

接下来,使用以下代码绘制集群:

plt.scatter(X[:,0],X[:,1], c=cluster.labels_, cmap='rainbow')

下图显示了我们数据点中的两个集群。

Two Clusters Datapoints

示例 2

正如我们在上面的简单示例中理解了树状图的概念一样,让我们转向另一个示例,在该示例中,我们使用层次聚类创建 Pima 印第安人糖尿病数据集中的数据点的集群:

import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
import numpy as np

from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

patient_data = data.iloc[:, 3:5].values
import scipy.cluster.hierarchy as shc
plt.figure(figsize=(10, 7)) 
plt.title("Patient Dendograms")

dend = shc.dendrogram(shc.linkage(data, method='ward'))

from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=4, affinity='euclidean', linkage='ward')
cluster.fit_predict(patient_data)

plt.figure(figsize=(7.2, 5.5))
plt.scatter(patient_data[:,0], patient_data[:,1], c=cluster.labels_,
cmap='rainbow') 

输出

运行此代码时,它将生成以下两个绘图作为输出:

Hierarchical Clustering1 Hierarchical Clustering2
广告