📜  聚类算法-K-均值算法

📅  最后修改于: 2020-12-10 05:40:19             🧑  作者: Mango


K-Means算法简介

K-均值聚类算法计算质心并进行迭代,直到找到最佳质心为止。它假定群集的数目是已知的。它也称为平面聚类算法。通过算法从数据中识别出的聚类数量以K均值中的“ K”表示。

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

K均值算法的工作

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

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

  • 步骤2-接下来,随机选择K个数据点并将每个数据点分配给一个群集。简单来说,就是根据数据点的数量对数据进行分类。

  • 步骤3-现在它将计算群集质心。

  • 步骤4-接下来,继续进行以下迭代,直到找到最佳质心,即将数据点分配给不再变化的群集的最佳质心-

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

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

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

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

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

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

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

用Python实现

以下两个实施K-Means聚类算法的示例将帮助我们更好地理解-

例子1

这是了解k均值工作原理的简单示例。在此示例中,我们将首先生成包含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,其中包含四个斑点-

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

世界地图

接下来,使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()

世界景点

例子2

让我们转到另一个示例,在该示例中,我们将对简单数字数据集应用K均值聚类。 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创建了具有64个特征的10个聚类。

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均值学习的聚类中心。

模糊

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

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均值将比层次聚类更快。

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

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

缺点

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

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

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

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

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

  • 如果群集具有复杂的几何形状,则不利于进行群集工作。

K均值聚类算法的应用

聚类分析的主要目标是-

  • 为了从我们正在使用的数据中获得有意义的直觉。

  • 聚类然后预测将为不同的子组构建不同的模型。

为了实现上述目标,K-均值聚类表现良好。它可以用于以下应用程序-

  • 市场细分

  • 文件丛集

  • 图像分割

  • 图像压缩

  • 客户细分

  • 分析动态数据趋势