聚类算法 K-means 算法


K-means 聚类算法计算质心并迭代,直到我们找到最佳质心。它假设集群的数量是已知的。它也被称为 扁平聚类 算法。通过算法从数据中识别出的簇数用 K-means 中的“K”表示。

在这个算法中,数据点被分配到一个簇中,使得数据点和质心之间的平方距离之和最小。应该理解,集群内的较小变化将导致同一集群内更多相似的数据点。

K-Means 算法的工作


我们可以通过以下步骤了解 K-Means 聚类算法的工作原理:

  • 步骤 1 :首先,我们需要指定这个算法需要生成的簇数,K。

  • 步骤 2 : 接下来,随机选择K个数据点,将每个数据点分配到一个簇中。简而言之,根据数据点的数量对数据进行分类。

  • 步骤 3 : 现在它会计算簇的质心。

  • 步骤 4 : 接下来,继续迭代以下,直到我们找到最优质心,也就是将数据点分配给不再变化的集群:

4.1 : 首先计算数据点与质心的距离平方和。

4.2 : 现在,我们必须将每个数据点分配给比其他集群(质心)更近的集群。

4.3 : 最后通过取集群所有数据点的平均值来计算集群的质心。

K-means 遵循 期望最大化 解决问题的方法。期望步骤用于将数据点分配给最近的集群,最大化步骤用于计算每个集群的质心。

在使用 K-means 算法时,我们需要注意以下事项:

  • 在使用包括 K-Means 在内的聚类算法时,建议对数据进行标准化,因为此类算法使用基于距离的测量来确定数据点之间的相似性。

  • 由于 K-Means 的迭代性质和质心的随机初始化,K-Means 可能会停留在局部最优并且可能不会收敛到全局最优。这就是为什么建议使用不同的质心初始化。

用 Python 实现


以下两个实现 K-Means 聚类算法的例子将有助于我们更好地理解它:

示例 1

这是一个了解 k-means 工作原理的简单示例。在此示例中,我们将首先生成包含 4 个不同 blob 的 2D 数据集,然后应用 k-means 算法查看结果。

首先,我们将从导入必要的包开始:

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

以下代码将生成 2D,包含四个 blob:

from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs(n_samples=400, centers=4, cluster_std=0.60, random_state=0)

接下来,下面的代码将帮助我们可视化数据集:

plt.scatter(X[:, 0], X[:, 1], s=20);
plt.show()
World Map

接下来,制作一个 KMeans 对象并提供集群数量,训练模型并进行预测,如下所示:

kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

现在,借助以下代码,我们可以绘制并可视化 k-means Python 估计器选择的集群中心:

plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=20, cmap='summer')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='blue', s=100, alpha=0.9);
plt.show()
World Spot

示例 2

让我们转到另一个示例,我们将在简单数字数据集上应用 K-means 聚类。 K-means 将尝试在不使用原始标签信息的情况下识别相似的数字。

首先,我们将从导入必要的包开始:

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

接下来,从 sklearn 加载数字数据集并创建一个对象。我们还可以在这个数据集中找到行数和列数,如下所示:

from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape
(1797, 64)

上面的输出显示这个数据集有 1797 个样本和 64 个特征。

我们可以像上面示例 1 中那样进行聚类:

kmeans = KMeans(n_clusters=10, random_state=0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape
(10, 64)

上面的输出显示,K-means 创建了 10 个具有 64 个特征的集群。

fig, ax = plt.subplots(2, 5, figsize=(8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
    axi.set(xticks=[], yticks=[])
    axi.imshow(center, interpolation='nearest', cmap=plt.cm.binary)

作为输出,我们将得到以下图像,显示通过 k-means 学习的聚类中心。

Blur

以下代码行将学习到的集群标签与其中找到的真实标签进行匹配:

from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
    mask = (clusters == i)
    labels[mask] = mode(digits.target[mask])[0]

接下来,我们可以检查准确性如下:

from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)
0.7935447968836951

上面的输出表明准确率在 80% 左右。

的优点和缺点


优点

以下是 K-Means 聚类算法的一些优点:

  • 它非常容易理解和实施。

  • 如果我们有大量变量,那么 K-means 会比分层聚类更快。

  • 在重新计算质心时,实例可以更改集群。

  • 与分层聚类相比,使用 K-means 形成更紧密的聚类。

缺点

以下是 K-Means 聚类算法的一些缺点:

  • 预测聚类的数量(即 k 的值)有点困难。

  • 输出受初始输入(如簇数(k 值))的强烈影响。

  • 数据顺序将对最终输出产生强烈影响。

  • 它对重新缩放非常敏感。如果我们将通过归一化或标准化的方式重新调整我们的数据,那么输出将完全改变。最终输出。

  • 如果簇具有复杂的几何形状,则不适合进行聚类工作。

K-Means聚类算法的应用


聚类分析的主要目标是:

  • 从我们正在处理的数据中获得有意义的直觉。

  • 集群然后预测将为不同子组构建不同模型的位置。

为了实现上述目标,K-means 聚类的表现已经足够好。可用于以下应用:

  • 市场细分

  • 文档聚类

  • 图像分割

  • 图像压缩

  • 客户细分

  • 分析动态数据的趋势