📅  最后修改于: 2020-12-10 05:40:19             🧑  作者: Mango
K-均值聚类算法计算质心并进行迭代,直到找到最佳质心为止。它假定群集的数目是已知的。它也称为平面聚类算法。通过算法从数据中识别出的聚类数量以K均值中的“ K”表示。
在该算法中,将数据点分配给群集,以使数据点和质心之间的平方距离之和最小。应当理解,簇内的较少变化将导致相同簇内的更多相似数据点。
我们可以通过以下步骤来了解K-Means聚类算法的工作原理-
步骤1-首先,我们需要指定此算法需要生成的簇数K。
步骤2-接下来,随机选择K个数据点并将每个数据点分配给一个群集。简单来说,就是根据数据点的数量对数据进行分类。
步骤3-现在它将计算群集质心。
步骤4-接下来,继续进行以下迭代,直到找到最佳质心,即将数据点分配给不再变化的群集的最佳质心-
4.1-首先,将计算数据点和质心之间的平方距离之和。
4.2-现在,我们必须将每个数据点分配给比其他群集(质心)更近的群集。
4.3-最后,通过获取该群集的所有数据点的平均值来计算群集的质心。
K均值遵循期望最大化方法来解决此问题。期望步骤用于将数据点分配给最接近的群集,而最大化步骤用于计算每个群集的质心。
使用K-means算法时,我们需要注意以下事项-
在使用包括K-Means的聚类算法时,建议对数据进行标准化,因为此类算法使用基于距离的度量来确定数据点之间的相似性。
由于K均值的迭代性质和质心的随机初始化,K均值可能会停留在局部最优中,而可能不会收敛于全局最优。因此,建议使用不同的质心初始化。
以下两个实施K-Means聚类算法的示例将帮助我们更好地理解-
这是了解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()
让我们转到另一个示例,在该示例中,我们将对简单数字数据集应用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-均值聚类表现良好。它可以用于以下应用程序-
市场细分
文件丛集
图像分割
图像压缩
客户细分
分析动态数据趋势