龙空技术网

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

BigQuant 1127

前言:

现时我们对“聚类算法属于无监督”大体比较着重,各位老铁们都想要知道一些“聚类算法属于无监督”的相关文章。那么小编在网摘上汇集了一些有关“聚类算法属于无监督””的相关内容,希望我们能喜欢,兄弟们快快来了解一下吧!

摘要

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

本文的结构如下在什么是层次聚类?聚类与分类的区别K-均值与层次聚类的区别分层聚类的类型聚集层次聚类如何识别两个集群是否相似?树状图是什么?可分割的层次聚类Python 中的分层聚类分层聚类的利与弊什么是层次聚类?

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

聚类与分类的区别

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

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

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

分类算法的常见例子有:逻辑回归模型支持向量分类器(SVM)朴素的贝叶斯决策树随机森林神经网络聚类算法的例子有:分层聚类K平均算法均值漂移聚类谱聚类

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

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

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

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

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

第一步

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

第二步

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

第三步

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

第四步

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

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

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

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

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

分层聚类的类型

有两种类型的分层聚类:

聚合层次聚类分层聚类聚集层次聚类

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

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

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

步骤1: 第一步是将每个数据点视为一个集群。步骤2: 确定两个相似的集群,并使它们成为一个集群。

步骤3: 重复该过程,直到只剩下单个集群如何识别两个集群是否相似?

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

距离(相似度)的度量

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

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

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

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

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

Hamming Distance 汉明距离Manhattan Distance (Taxicab or City Block) 曼哈顿距离(计程车几何)Minkowski Distance 闵氏距离

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

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

连接标准

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

Single-Linkage:单连接或最近的连接是两个集群中一对观测值之间的最短距离。Complete-linkage:完全连接或最远的连接是两个集群中一对观测值之间的最远距离。Average-linkage:平均连接是指一组中的每个观测到另一组中的每个观测之间的距离。Centroid-linkage:质心连接是两个集群的质心之间的距离。在这里,您需要找到两个集群的质心,然后在合并之前计算它们之间的距离。ward linkage:它是用来最小化数据的差异与层次的方法(离差平方和法)。该方法寻求选择连续的聚类步骤,以尽量减少每一步的平方误差之和的增加。

连接判据的选择是基于领域应用的。平均连接和完全连接是层次聚类中最常用的两种距离度量方法。然而,当联系标准的选择没有明确的理论依据时,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 librariesimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn import datasets# Import iris data iris = datasets.load_iris()iris_data = pd.DataFrame(iris.data)iris_data.columns = iris.feature_namesiris_data['flower_type'] = iris.targetiris_data.head()
想象课程
iris_X = iris_data.iloc[:, [0, 1, 2,3]].valuesiris_Y = iris_data.iloc[:,4].valuesimport matplotlib.pyplot as pltplt.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 dendrogramplt.figure(figsize=(20, 7))  plt.title("Dendrograms")  # Create dendrogramsc.dendrogram(sc.linkage(iris_x, method='ward'))plt.title('Dendrogram')plt.xlabel('Sample index')plt.ylabel('Euclidean distance')

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

合适的模型

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

from sklearn.cluster import AgglomerativeClusteringcluster = 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 中实现。

标签: #聚类算法属于无监督 #聚类算法是无监督算法吗