Python人工智能-无监督学习:聚类
无监督的机器学习算法没有任何监督者提供任何形式的指导。这就是为什么它们与一些人所说的真正的人工智能紧密相连。
在无监督学习中,不会有正确的答案,也没有老师的指导。算法需要在数据中发现有趣的模式进行学习。
什么是聚类
基本上,它是一种无监督的学习方法,也是许多领域中常用的统计数据分析技术。聚类主要是将观测数据集划分为子集,称为聚类,其方式是同一聚类中的观测数据在某种意义上是相似的,而它们与其他聚类中的观测数据是不相似的。简单地说,我们可以说聚类的主要目的是在相似性和不相似性的基础上对数据进行分组。
例如,下图显示了不同聚类中的同类数据 —
数据聚类的算法
以下是几种常见的数据聚类算法
K-Means算法
K-means聚类算法是著名的数据聚类算法之一。我们需要假设聚类的数量已经知道。这也被称为平面聚类。它是一种迭代式聚类算法。这个算法需要遵循以下步骤– 1.
第1步 - 我们需要指定所需的K个子群的数量。
第2步 --固定聚类的数量,并将每个数据点随机分配到一个聚类。或者换句话说,我们需要根据聚类的数量来对我们的数据进行分类。
在这一步,应该计算聚类中心点。
由于这是一个迭代算法,我们需要在每次迭代中更新K中心点的位置,直到我们找到全局最优,或者换句话说,中心点达到最佳位置。
下面的代码将有助于在Python中实现K-means聚类算法。我们将使用Scikit-learn模块。
让我们导入必要的包–
下面这行代码将有助于通过使用 sklearn.dataset 包中的 make_blob 生成二维数据集,其中包含四个 blob 。
我们可以通过使用以下代码来实现数据集的可视化 —
在这里,我们将kmeans初始化为KMeans算法,所需参数为多少个集群(n_clusters)。
我们需要用输入数据训练K-means模型。
下面给出的代码将帮助我们根据我们的数据绘制和可视化机器的发现,以及根据要找到的集群数量进行的配合。
平均移位算法
这是另一种流行的、强大的聚类算法,用于无监督学习。它不做任何假设,因此它是一种非参数算法。它也被称为分层聚类或平均移位聚类分析。以下是该算法的基本步骤
- 首先,我们需要把数据点分配到它们自己的一个聚类中。
-
现在,它计算中心点并更新新中心点的位置。
-
通过重复这个过程,我们向集群的峰值靠近,即向高密度的区域移动。
-
这个算法在中心点不再移动的阶段停止。
在以下代码的帮助下,我们在Python中实现了平均移动聚类算法。我们将使用Scikit-learn模块。
让我们导入必要的包–
下面的代码将有助于通过使用 sklearn.dataset 包中的 make_blob 生成二维数据集,包含四个blob。
我们可以用下面的代码将数据集可视化
现在,我们需要用输入的数据来训练平均移动集群模型。
下面的代码将根据输入的数据打印集群中心和预期的集群数量:
下面给出的代码将有助于根据我们的数据绘制和可视化机器的发现,并根据要找到的集群数量进行拟合。
衡量聚类的性能
现实世界的数据并不自然地被组织成一些独特的聚类。由于这个原因,它不容易被可视化并得出推论。这就是为什么我们需要测量聚类的性能和质量。这可以在剪影分析的帮助下完成。
轮廓分析
这种方法可以通过测量聚类之间的距离来检查聚类的质量。基本上,它提供了一种方法,通过给出一个剪影分数来评估集群的数量等参数。这个分数是一个衡量一个聚类中的每个点与相邻聚类中的每个点的接近程度的指标。
剪影分数的分析
这个分数的范围是[-1, 1]。Following is the analysis of this score −
- 分数 为+1 – 分数接近+1表示样本离相邻的聚类很远。
-
0 分–0分表示样本在两个相邻聚类之间的决策边界上或非常接近。
-
分数为 -1 - 负分表示样本被分配到了错误的聚类中。
计算剪影分数
在本节中,我们将学习如何计算剪影分数。
剪影得分可通过以下公式计算 −
这里,𝑝是与数据点不属于的最近聚类中的点的平均距离。而且,𝑞是与它自己的聚类中的所有点的平均聚类内距离。
为了找到最佳的聚类数量,我们需要从 sklearn 包中导入 度量 模块,再次运行聚类算法。在下面的例子中,我们将运行K-means聚类算法来找到最优的簇数–
导入必要的包,如图所示 —
在以下代码的帮助下,我们将通过使用 sklearn.dataset 包中的 make_blob 生成二维数据集,其中包含四个blob。
如图所示,初始化变量-
我们需要通过所有的值来迭代K-means模型,也需要用输入数据来训练它。
现在,使用欧氏距离指标估计当前聚类模型的剪影分数–
下面这行代码将有助于显示集群的数量以及Silhouette得分。
你将收到以下输出 −
现在,最佳集群数量的输出将如下—-。
寻找最近的邻居
如果我们想建立推荐系统,如电影推荐系统,那么我们就需要了解寻找最近的邻居的概念。这是因为推荐系统利用了最近的邻居的概念。
寻找近邻的概念 可以被定义为从给定的数据集中寻找与输入点最接近的点的过程。这种KNN(K-nearest neighbors)算法的主要用途是建立分类系统,根据输入数据点与各种类别的接近程度对数据点进行分类。
下面给出的Python代码有助于找到一个给定数据集的K-近邻-
如下图所示,导入必要的包。这里,我们使用的是 sklearn 包中的 NearestNeighbors 模块。
现在让我们来定义输入数据–
现在,我们需要定义最近的邻居–。
我们还需要给出测试数据,从中找到最近的邻居:
下面的代码可以将我们定义的输入数据可视化并绘制出来:
现在,我们需要建立K最近的邻居。该对象也需要被训练
现在,我们可以打印K个最近的邻居,如下所示
我们可以将最近的邻居与测试数据点一起可视化。
输出
K最近的邻居
K-最近的邻居分类器
K-Nearest Neighbors(KNN)分类器是一种分类模型,它使用最近的邻居算法来对给定的数据点进行分类。我们在上一节已经实现了KNN算法,现在我们要用该算法建立一个KNN分类器。
KNN分类器的概念
K-近邻分类的基本概念是找到一个预定义的数字,即’k’–与新样本距离最近的训练样本,该样本必须被分类。新样本将从邻居本身获得它们的标签。KNN分类器有一个固定的用户定义的常数来决定邻居的数量。对于距离,标准的欧氏距离是最常见的选择。KNN分类器直接在学习的样本上工作,而不是创建学习的规则。KNN算法是所有机器学习算法中最简单的一种。它在大量的分类和回归问题上相当成功,例如,字符识别或图像分析。
例子
我们正在建立一个KNN分类器来识别数字。为此,我们将使用MNIST数据集。我们将在Jupyter笔记本中编写这段代码。
如下图所示,导入必要的包。
在这里,我们使用 sklearn.neighbors 包中的 KNeighborsClassifier 模块-
下面的代码将显示数字的图像,以验证我们要测试的图像:
现在,我们需要加载MNIST数据集。实际上,总共有1797张图片,但我们使用前1600张图片作为训练样本,剩下的197张将被保留用于测试。
现在,在显示图像时,我们可以看到输出如下-
Image_display(0)
0的图像显示如下 –
Image_display(9)
9的图像显示如下
digit.keys()
现在,我们需要创建训练和测试数据集,并向KNN分类器提供测试数据集。
下面的输出将创建K近邻分类器构造器-
我们需要通过提供任何大于1600的任意数字来创建测试样本,这些样本是训练样本。
Image_display(6)
6的图像显示如下 –
现在我们将预测测试数据,如下所示 −
上述代码将产生以下输出 –
现在,请考虑以下几点 −
上述代码将产生以下输出 –