Python中的分层聚类算法

Tavish Aggarwal.

在前面的帖子中, Python中的无监督学习k-means族聚类算法 我们讨论了K表示聚类算法。我们学习了如何使用K表示聚类算法解决机器学习无监督学习问题。

如果您不了解K意味着聚类算法或具有有限的知识,我建议您通过帖子。

在这篇文章中,我们将研究用于解决无监督学习问题的分层聚类算法。顾名思义该算法还用于解决群集无监督的学习问题。

让我们开始吧。

分层群集

k的最大挑战之一意味着我们需要事先知道k值。分层聚类算法没有此限制。分层聚类算法将具有相似特性的数据点组合在一起。分层群集有两种类型:

  1. 凝聚力:涉及自下而上的方法。我们从n个不同的群集开始,迭代地达到我们只有1个群集的点,到底,它被称为群集聚类。 
  2. 分裂:涉及自上而下的方法。我们从1个大群集开始,随后继续分区此群集以达到n个群集,每个群集包含1个元素,它称为划分群集。

在这篇文章中,我们将讨论群集分层聚类。

凝聚层次分层聚类

凝聚层次聚类是技术,在那里我们开始将每个数据点视为一个群集。然后我们启动彼此接近的群集数据点。我们重复此过程,直到我们形成一个大集群。

分层群集的步骤是:

  1. 计算NXN距离(相似性)矩阵,其计算来自另一个数据点的每个数据点的距离。
  2. 每个项目首先分配给自己的群集,即形成n个集群。
  3. 彼此最接近的群集被合并以形成单个群集。
  4. 重复计算距离和合并最接近群集的相同步骤,直到所有点都成为单簇的一部分。

我们可以使用树木图(倒树形结构)直观地探索所提到的聚类。树木图是说明通过分层聚类产生的集群的布置的重要方法。让我们绘制一个树形图,并在操作中看到分层群集:

from scipy.cluster.hierarchy import linkage, dendrogram
from sklearn.datasets import load_wine
import matplotlib.pyplot as plt

data = load_wine()
X = data.data
y = data.target

plt.figure(num=None, figsize=(20, 10), dpi=80, facecolor='w', edgecolor='k')

mergings = linkage(X, method='complete')

dendrogram(mergings, labels=y, leaf_rotation=0, leaf_font_size=10)
plt.show()

输出:

dendogram.

Prinkage函数中的方法参数用于指定用于测量两个集群之间距离的技术。我们可以使用以下技术来查找群集之间的距离:

  • 单个:2个簇之间的距离被定义为两个集群点之间的最短距离
  • 完成:2个群集之间的距离被定义为群集中的任何2个点之间的最大距离
  • 平均值:2个集群之间的距离被定义为每个群集的每个群集的每个点之间的平均距离。
  • 加权
  • 封面
  • 中位数
  • ward

笔记: 不同的链接方法导致不同的分层聚类。

观察结果:

  1. 在上面显示的示例中,我们正在使用来自SCIPY包的Dendrogram函数来生成可视化。
  2. 我们正在使用完整的方法来创建链接。
  3. 树形图的高度指定了合并群集之间的最大距离。在图中,它在Y轴上表示。

一旦我们绘制了树木曲线图,选择了没有通过它的任何水平线的垂直距离,并且通过它绘制水平线。该新创建的水平线通过的垂直线路的数量等于群集数。考虑下面显示的图表(它是与上面示例生成的相同的图表):

Dengograph Clustering.黑色绘制的水平线是定义为单独群集所需的最小距离的阈值。

现在我们对树木图进行了理解。现在是时候拍摄了一步并将数据分组到群集中。让我们继续使用该示例来查看在操作中创建的群集:

import matplotlib.pyplot as plt  
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import load_wine

data = load_wine()
X = data.data
y = data.target

cluster = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='ward')  
cluster.fit_predict(X)  

print(cluster.labels_)

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

输出:

凝聚聚类

有了这个,我们已成功找到未标记的数据集中的模式。

还有更多吗?是的,在我们结束凝聚层次聚类之前,最后一件事。我们还可以提取创建的中间群集。

例如,如下,如下所示的树木图所示,如果我想提取以下群集,那么什么:

树文图Fcluster.

是的。我可以通过选择树木图上的高度来完成此操作。如您所知,树木图上的y轴表示合并群集之间的距离。如果我们希望看到数据点被分组的群集形成特定高度,我们可以使用FCLuster函数执行此操作。让我们来看看下面显示的一个例子:

import pandas as pd
from scipy.cluster.hierarchy import fcluster
from sklearn.datasets import load_wine

data = load_wine()
X = data.data
y = data.target

mergings = linkage(X, method='complete')

labels = fcluster(mergings, 700, criterion='distance')

df = pd.DataFrame({'labels': labels, 'varieties': y})

ct = pd.crosstab(df['labels'], df['varieties'])

print(ct)

笔记: 标签表示从索引1的索引1而不是索引0开始。

树木图看起来很有用。不是吗?

限制

  1. 计算每个观点的每个点的距离是耗时的并且需要大量的处理能力。

概括

在这篇文章中,我们了解到:

  1. 什么是分层聚类及其类型?
  2. 我们讨论了凝聚层次聚类
  3. 我们学会了如何生成树木图
  4. 我们通过链接方法的各种方法来计算群集之间的距离
  5. 我们通过绘图散射图来生成具有凝聚分层聚类的模型,并看到模式
  6. 我们看到如何使用Fcluster函数提取中间群集

在下一个帖子中,我们将学习分裂分层聚类。请告诉我您在下面的评论部分中的帖子中的考虑。

作者信息

Tavish Aggarwal.

网站: http://tavishaggarwal.com

Tavish Aggarwal.是一个数据科学家 在一个海德拉巴工作,具有广泛的经验,在跨电子商务,财务,医疗保健等等不同领域解决现实世界的业务问题。 他对技术充满热情,喜欢在团队中工作。