聚类算法分层聚类


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

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

分层次算法 : 另一方面,在划分层次算法中,所有数据点都被视为一个大簇,聚类的过程涉及将一个大簇划分(自顶向下方法)为多个小簇。

执行凝聚层次聚类的步骤


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

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

  • 步骤 2 : 现在,在这一步中,我们需要通过连接两个 closet 数据点来形成一个大集群。这将导致总共有 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()
Random Dots

从上图中,很容易看出我们在 out 数据点中有两个集群,但在现实世界的数据中,可能有数千个集群。接下来,我们将使用 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()
Building

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

Red Building

接下来,我们需要导入用于聚类的类并调用其 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')
Random Red Dots

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

例子2

当我们从上面讨论的简单示例中理解了树状图的概念后,让我们转到另一个示例,在该示例中,我们使用层次聚类创建 Pima Indian Diabetes Dataset 中的数据点的聚类:

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]
data.shape
(768, 9)
data.head()
slno. preg Plas Pres skin test mass pedi age class
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
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'))
Green Building
from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=4, affinity='euclidean', linkage='ward')
cluster.fit_predict(patient_data)
plt.figure(figsize=(10, 7))
plt.scatter(patient_data[:,0], patient_data[:,1], c=cluster.labels_, cmap='rainbow')
Brown