一文读懂非监督式学习算法聚类

摘要

随着原始数据的丰富和分析的需要,非监督式学习的概念随着时间的推移变得流行起来。非监督式学习的主要目标是发现未标记数据中隐藏的、令人兴奋的模式。最常见的非监督式学习算法是聚类。数据聚类的应用范围从医学到面部识别到股票市场分析。在这篇文章中,我们讨论了层次聚类。

本文的结构如下在

什么是层次聚类?

分层聚类是一种非监督式学习,它将相似的数据点或对象分组,称为聚类。那么什么是集群和非监督式学习?

聚类与分类的区别

分类和聚类都试图根据不同特征的相似性将数据点分为一个或多个类。区别在于两者的工作方式。分类是一种有监督的算法,每个输入数据点(Xi)都有预定义的标签(yi)。

然而,聚类是一种无监督的算法,其中标签丢失意味着数据集只包含输入数据点(Xi)。

另一个主要区别是由于分类技术有标签,因此需要训练和测试数据集来验证模型。在集群中,没有标签,因此不需要训练和测试数据集。

分类算法的常见例子有:

聚类算法的例子有:

在本文中,我们将深入研究分层集群的细节。

K- 均值聚类与层次聚类的区别

我们为什么需要层次聚类?答案在于K-均值聚类。

我们可以用外行人的语言理解 K-均值聚类。

我们的任务是使用 K平均算法将未标记的数据分组到集群中。

第一步

第一步是确定集群的数量(k)。假设我们已经决定将数据分成两组。

第二步

一旦确定了群集,我们随机初始化两个点,称为群集质心。

第三步

在第三步中,算法对每一个数据点进行处理,根据它是接近红色聚类中心还是接近绿色聚类中心,将这些数据点划分为不同的类。

第四步

在第四步中,我们移动质心步骤。我们计算所有红点的平均值,移动红色的聚类中心到那里,对绿色的聚类做同样的事情。

我们将执行第3步和第4步,直到集群质心不再进一步移动。在这个例子中,点的颜色不会再改变。

K-means 过程看起来不错,对吧?

但是有一个问题,或者我们可以说这个过程的局限性。在算法开始时,我们需要确定聚类的数量。但我们不知道一开始需要多少个星团。

分层集群填补了这一空白。在分层集群中,我们不需要在一开始就定义集群的数量。看看效果如何。

分层聚类的类型

有两种类型的分层聚类:

聚集层次聚类

聚合层次聚类是最常见的一种层次聚类方法,用于根据对象的相似性对其进行聚类。这是一种自下而上的方法,每个观察从它自己的集群开始,当一个集群向上移动时,一对对集群被合并。

  1. 聚合层次聚类是如何工作的?

假设您有一些数据点,希望将它们分组到类似的集群中。



如何识别两个集群是否相似?

这样做的方法之一是找出星系团之间的距离。

距离(相似度)的度量

两个星系团之间的距离可以根据从一个星系团到另一个星系团所画的直线的长度来计算。这通常被称为欧几里得度量。

欧几里得度量: 平面或三维空间中两点之间的欧几里得度量测量连接两点的一段的长度。这是表示两点之间距离最明显的方法。

如果(x1,y1)和(x2,y2)是二维空间中的点,那么它们之间的欧几里得度量就是

(x2-x1)2-(y2-y1)2

除了欧几里得度量,还开发了其他一些测量距离的指标,例如:

距离度量标准的选择应该基于学习领域或者你试图解决的问题。

例如,如果您试图在一个统一的网格上测量对象之间的距离,如棋盘或城市街区。那么曼哈顿的距离将是一个明智的选择。

连接标准

在选择距离度量之后,有必要确定从何处计算距离。一些常见的联系方法是:

连接判据的选择是基于领域应用的。平均连接和完全连接是层次聚类中最常用的两种距离度量方法。然而,当联系标准的选择没有明确的理论依据时,ward linkage是默认选择。

如何选择集群的数量?

在层次聚类中,我们利用树状图的概念来选择聚类的数量。

树状图是什么?

树状图是一种树状图,显示了观测值之间的层次关系。它包含层次聚类算法的内存。

通过观察树状图,你可以知道星团是如何形成的。让我们看看如何为下面的数据点形成树状图。

观测值E和F在任何其他点上彼此最接近。因此,它们被组合成一个集群连接它们的链接的高度也是最小的。接下来最接近的是A和B,它们结合在一起。

这也可以在树状图中观察到,因为A和B之间的块的高度略大于E和F。同样,D可以合并成E和F簇,然后C可以合并成那个簇。最后A和B组合成C、D、E和F形成一个单独的集群。

在阅读树状图时需要注意的重点是:

块的高度表示群集之间的距离,而观测值之间的距离代表不同之处。

但是问题仍然没有改变,我们如何使用树状图来找到星系团的数量,或者我们应该在哪里停止合并星系团。通过在树状图上画一条水平线,观测结果被分配到集群中。

一般来说,我们把树状图切成最高的垂直线。在上面的示例中,我们有两个集群。一个星团有观测A 和B,第二个星团有C,D,E和F。

可分割的层次聚类

分层聚类在解决实际问题中应用不多。它的工作方式与聚集性集群相反。在这里,我们首先将所有数据点作为一个集群。

在每次迭代中,我们分离最远的点或集群,这些点或集群并不相似,直到每个数据点被视为一个单独的集群。在这里,我们将单个集群划分为 n 个集群,因此名称划分集群。

Python中的分层聚类

为了演示 Python中分层集群的应用,我们将使用鸢尾花(Iris)数据集。鸢尾花(Iris)数据集是机器学习中最常举例使用的数据集之一。

鸢尾花(Iris)数据有三种类型的鸢尾花,它们是因变量中的三类。它包含四个自变量,即萼片长度、萼片宽度、花瓣长度和花瓣宽度,均以厘米为单位。我们将比较原始的类和使用层次聚类方法形成的类。

导入数据

我们将从 sklearn 库导入数据集。

# Import libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

# Import iris data 
iris = datasets.load_iris()

iris_data = pd.DataFrame(iris.data)
iris_data.columns = iris.feature_names
iris_data['flower_type'] = iris.target
iris_data.head()

想象课程

iris_X = iris_data.iloc[:, [0, 1, 2,3]].values
iris_Y = iris_data.iloc[:,4].values

import matplotlib.pyplot as plt
plt.figure(figsize=(10, 7))
plt.scatter(iris_X[iris_Y == 0, 0], iris_X[iris_Y == 0, 1], s=100, c='blue', label='Type 1')
plt.scatter(iris_X[iris_Y == 1, 0], iris_X[iris_Y == 1, 1], s=100, c='yellow', label='Type 2')
plt.scatter(iris_X[iris_Y == 2, 0], iris_X[iris_Y == 2, 1], s=100, c='green', label='Type 3')
plt.legend()
plt.show()

上述散点图显示,所有三类鸢尾花是重叠的彼此。我们的任务是使用分层聚类形成聚类,并将它们与原始类进行比较。

创建一个树状图

我们从导入有助于创建树状图的库开始。树状图有助于粗略地了解集群的数量。

import scipy.cluster.hierarchy as sc

# Plot dendrogram
plt.figure(figsize=(20, 7))  
plt.title("Dendrograms")  

# Create dendrogram
sc.dendrogram(sc.linkage(iris_x, method='ward'))

plt.title('Dendrogram')
plt.xlabel('Sample index')
plt.ylabel('Euclidean distance')

通过查看上面的树状图,我们将数据分为三组。

合适的模型

我们实例化了聚集聚类。传递欧几里得度量作为测量点和病房联系之间的距离来计算群集的接近度。然后我们在数据点上拟合模型。最后,我们返回一个整数数组,其中的值使用lables _ property 对应于不同的类别。

from sklearn.cluster import AgglomerativeClustering

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

cluster.fit(iris_x)
labels = cluster.labels_
labels

上面的输出显示了0、1、2的值,因为我们定义了4个集群。0表示属于第一个集群的点,1表示第二个集群中的点。类似地,Third 表示第三个集群中的点。

想象集群

plt.figure(figsize=(10, 7))
plt.scatter(iris_x[labels == 0, 0], iris_x[labels == 0, 1], s = 100, c = 'blue', label = 'Type 1')
plt.scatter(iris_x[labels == 1, 0], iris_x[labels == 1, 1], s = 100, c = 'yellow', label = 'Type 2')
plt.scatter(iris_x[labels == 2, 0], iris_x[labels == 2, 1], s = 100, c = 'green', label = 'Type 3')
plt.legend()
plt.show()

类型1和类型3集群之间仍然存在重叠。但是如果与原来的集群相比,分类已经有了相当大的改进。

分层聚类的利与弊

1. 像K平均算法一样,我们不需要指定算法所需的集群数量。

2.它在大型数据集上不能很好地工作。它通常适用于较小的数据。如果您有一个大型的数据集,就很难通过树状图来确定正确的集群数量。

3. 与K-均值聚类相比,层次聚类计算量大,运行时间长。

结论

尽管层次聚类在处理大型数据集时存在一定的局限性,但它仍然是处理中小型数据集并发现其中模式的有效工具。在本文中,我们讨论了分层聚类的基本概念,这是一种非监督式学习算法,并在 Python 中实现。

展开阅读全文

页面更新:2024-03-25

标签:算法   星系团   质心   树状   据点   度量   集群   层次   距离   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top