Machine Learning With Python 简明教程

Clustering Algorithms - K-means Algorithm

Introduction to K-Means Algorithm

K-means 聚类算法计算质心并迭代,直到找到最优质心。它假设已知集群数。它也被称为 flat clustering 算法。k-means 中算法通过数据识别的集群数由“K”表示。

此算法中,数据点被分配给一个集群,数据点和质心之间的平方距离总和将达到最小值。可以理解的是,集群内方差越小,同一集群内的数据点越相似。

Working of K-Means Algorithm

我们可借助以下步骤理解 K 均值聚类算法的工作原理:

  1. Step 1 - 首先,我们需要指定由该算法生成的簇数 K。

  2. Step 2 - 接下来,随机选择 K 个数据点并将每个数据点分配给一个簇。简而言之,根据数据点数量对数据进行分类。

  3. Step 3 − 现在它将计算聚类质心。

  4. Step 4 − 接下来,继续迭代以下步骤,直到我们找到最优质心(即数据点分配到不再有变化的聚类)−

4.1 - 首先,计算数据点和质心之间的平方距离之和。

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

4.3 - 最后,通过取该集群内的所有数据点的平均值来计算此集群的质心。

K 均值采用 Expectation-Maximization 方法来解决问题。期望步用于将数据点分配给最接近的集群,最大化步用于计算每个集群的质心。

使用 K 均值算法时,我们需要注意以下事项:

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

  2. 由于 K 均值的迭代性质和质心的随机初始化,K 均值可能会停留在局部最优,并且可能无法收敛到全局最优。因此,建议使用不同的质心初始化。

Implementation in Python

用于实现 K 均值聚类算法的以下两个示例将有助于我们更好地理解此算法:

Example 1

这是一个简单的示例,用于理解 k 均值的工作方式。在此示例中,我们将首先生成包含 4 个不同斑点的 2D 数据集,然后应用 k 均值算法来查看结果。

首先,我们将通过导入必要的包来开始:

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

以下代码将生成包含 4 个斑点的 2D:

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

Example 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

Output

(1797, 64)

以上输出表明,此数据集包含 1797 个样本,具有 64 个特征。

我们可以如以上示例 1 中所述执行集群 −

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

Output

(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)

Output

作为输出,我们将获得以下图像,显示 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)

Output

0.7935447968836951

以上输出表明,精确度约为 80%。

Advantages and Disadvantages

Advantages

以下是 K-Means 集群算法的一些优点 −

  1. 它很容易理解和实施。

  2. 如果我们有大量变量,那么 K-Means 将比层次集群更快。

  3. 在重新计算质心时,一个实例可以改变集群。

  4. 与层次集群相比,K-Means 形成更紧密的集群。

Disadvantages

以下是 K-Means 集群算法的一些缺点 −

  1. 预测集群数即 k 的值有点困难。

  2. 输出受到初始输入(如集群数(k 的值))的强烈影响。

  3. 数据顺序将对最终输出产生重大影响。

  4. 对缩放非常敏感。如果我们通过归一化或标准化方法重新缩放数据,那么输出将完全改变。最终结果。

  5. 如果群集具有复杂的几何形状,则在执行群集作业中效果不佳。

Applications of K-Means Clustering Algorithm

聚类分析的主要目标为 -

  1. 从我们正在使用的数据中获得有意义的直觉。

  2. 构建不同子群不同模型的群集然后预测。

为了实现上述目标,K 均值聚类表现得足够好。它可以用于以下应用中 -

  1. Market segmentation

  2. Document Clustering

  3. Image segmentation

  4. Image compression

  5. Customer segmentation

  6. 分析动态数据的趋势