AI with Python - 无监督学习:聚类

无监督机器学习算法没有任何监督者提供任何类型的指导。这就是为什么它们与一些人所说的真正的人工智能密切相关。

在无监督学习中,没有正确答案,也没有老师指导。算法需要发现数据中有趣的模式来进行学习。

什么是聚类?

基本上,它是一种无监督学习方法,也是许多领域中使用的统计数据分析的常用技术。聚类主要是将观测值集划分为子集(称为簇)的任务,使得同一簇中的观测值在某种意义上是相似的,而与其他簇中的观测值不相似。简而言之,我们可以说聚类的主要目标是根据相似性和不相似性对数据进行分组。

例如,下图显示了不同集群中的类似数据 -

聚类

数据聚类算法

以下是一些用于对数据进行聚类的常见算法 -

K-Means 算法

K-means聚类算法是众所周知的数据聚类算法之一。我们需要假设簇的数量是已知的。这也称为平面聚类。它是一种迭代聚类算法。该算法需要遵循以下步骤 -

步骤 1 - 我们需要指定所需的 K 个子组数量。

步骤 2 - 固定簇的数量并将每个数据点随机分配给一个簇。或者换句话说,我们需要根据簇的数量对数据进行分类。

在此步骤中,应计算簇质心。

由于这是一个迭代算法,我们需要在每次迭代中更新 K 个质心的位置,直到找到全局最优值,或者换句话说,质心到达其最佳位置。

以下代码将有助于在Python中实现K-means聚类算法。我们将使用 Scikit-learn 模块。

让我们导入必要的包 -

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans

以下代码行将帮助使用sklearn.dataset包中的make_blob生成包含四个 blob 的二维数据集。

from sklearn.datasets.samples_generator import make_blobs

X, y_true = make_blobs(n_samples = 500, centers = 4,
            cluster_std = 0.40, random_state = 0)

我们可以使用以下代码可视化数据集 -

plt.scatter(X[:, 0], X[:, 1], s = 50);
plt.show()
K均值算法

在这里,我们将 kmeans 初始化为 KMeans 算法,所需参数为簇数 (n_clusters)。

kmeans = KMeans(n_clusters = 4)

我们需要用输入数据训练 K 均值模型。

kmeans.fit(X)
y_kmeans = kmeans.predict(X)
plt.scatter(X[:, 0], X[:, 1], c = y_kmeans, s = 50, cmap = 'viridis')

centers = kmeans.cluster_centers_

下面给出的代码将帮助我们根据我们的数据绘制和可视化机器的发现,并根据要找到的簇的数量进行拟合。

plt.scatter(centers[:, 0], centers[:, 1], c = 'black', s = 200, alpha = 0.5);
plt.show()
K均值算法2

均值平移算法

它是无监督学习中使用的另一种流行且强大的聚类算法。它不做任何假设,因此它是一种非参数算法。它也称为层次聚类或均值漂移聚类分析。以下是该算法的基本步骤 -

  • 首先,我们需要先将数据点分配到自己的簇中。

  • 现在,它计算质心并更新新质心的位置。

  • 通过重复这个过程,我们向簇的峰值移动,即向密度更高的区域移动。

  • 该算法在质心不再移动的阶段停止。

借助以下代码,我们正在 Python 中实现 Mean Shift 聚类算法。我们将使用 Scikit-learn 模块。

让我们导入必要的包 -

import numpy as np
from sklearn.cluster import MeanShift
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")

以下代码将帮助使用sklearn.dataset包中的make_blob生成包含四个 blob 的二维数据集。

from sklearn.datasets.samples_generator import make_blobs

我们可以使用以下代码可视化数据集

centers = [[2,2],[4,5],[3,10]]
X, _ = make_blobs(n_samples = 500, centers = centers, cluster_std = 1)
plt.scatter(X[:,0],X[:,1])
plt.show()
均值漂移算法

现在,我们需要使用输入数据训练 Mean Shift 聚类模型。

ms = MeanShift()
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_

以下代码将根据输入数据打印聚类中心和预期的聚类数量 -

print(cluster_centers)
n_clusters_ = len(np.unique(labels))
print("Estimated clusters:", n_clusters_)
[[ 3.23005036 3.84771893]
[ 3.02057451 9.88928991]]
Estimated clusters: 2

下面给出的代码将有助于根据我们的数据绘制和可视化机器的发现,并根据要找到的簇的数量进行拟合。

colors = 10*['r.','g.','b.','c.','k.','y.','m.']
   for i in range(len(X)):
   plt.plot(X[i][0], X[i][1], colors[labels[i]], markersize = 10)
plt.scatter(cluster_centers[:,0],cluster_centers[:,1],
   marker = "x",color = 'k', s = 150, linewidths = 5, zorder = 10)
plt.show()
簇数

测量集群性能

现实世界的数据不会自然地组织成许多独特的集群。由于这个原因,不容易想象和推断。这就是为什么我们需要测量聚类性能及其质量。这可以借助轮廓分析来完成。

轮廓分析

该方法可用于通过测量簇之间的距离来检查聚类的质量。基本上,它提供了一种通过给出轮廓分数来评估参数(例如簇数量)的方法。该分数是衡量一个簇中的每个点与相邻簇中的点的接近程度的指标。

轮廓得分分析

分数的范围为 [-1, 1]。以下是对该分数的分析 -

  • +1 的得分- 接近 +1 的得分表示样本远离邻近簇。

  • 分数 0 - 分数 0 表示样本位于或非常接近两个相邻簇之间的决策边界。

  • 分数为 -1 - 负分数表示样本已分配到错误的簇。

计算轮廓分数

在本节中,我们将学习如何计算轮廓分数。

轮廓分数可以使用以下公式计算 -

$$剪影得分 = \frac{\left ( pq \right )}{max\left ( p,q \right )}$$

这里,