介绍
K-Means 是最流行的聚类算法之一。 通过将中心点设置为集群,它可以根据其他点到该中心点的距离对其他点进行分组。
K-Means 的一个缺点是必须选择集群的数量, K,在运行对点进行分组的算法之前。
如果您想阅读 K-Means 聚类的深入指南,请查看 “使用 Scikit-Learn 进行 K-Means 聚类”.
弯头法和轮廓分析
选择 K 数量最常用的技术是 肘法 和 轮廓分析.
为了方便 Ks 的选择, 黄砖 库用 for 循环和一个我们通常会写成 4 行代码的图来包装代码。
要直接从 Jupyter 笔记本安装 Yellowbrick,请运行:
! pip install yellowbrick
让我们看看它是如何处理一个熟悉的数据集的,它已经是 Scikit-learn 的一部分, 鸢尾花 数据集。
第一步是导入数据集, KMeans
和 yellowbrick
库,并加载数据:
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from yellowbrick.cluster import KElbowVisualizer, SilhouetteVisualizer
iris = load_iris()
注意这里,我们导入 KElbowVisualizer
和 SilhouetteVisualizer
止 yellowbrick.cluster
,这些是我们将用于可视化 Elbow 和 Silhouette 结果的模块!
加载数据集后,在 data
一堆的键(一种数据类型,它是字典的扩展)是我们想要聚类的点的值。 如果您想知道数字代表什么,请查看 iris['feature_names']
.
众所周知,鸢尾花数据集包含三种类型的鸢尾花:'versicolor'、'virginica'和'setosa'。 您还可以检查类 iris['target_names']
核实。
因此,我们有 4 个要聚类的特征,根据我们已经知道的,它们应该被分成 3 个不同的聚类。 让我们看看我们的肘部方法和轮廓分析的结果是否会证实这一点。
首先,我们将选择特征值:
print(iris['feature_names'])
print(iris['target_names'])
X = iris['data']
然后,我们可以创建一个 KMeans
模型,一个 KElbowVisualizer()
实例将接收该模型以及将为其计算度量的 ks 数,在这种情况下来自 2到11 KS。
之后,我们使用数据使可视化器拟合 fit()
并显示情节 show()
. 如果未指定指标,则可视化工具使用 失真 度量,它计算从每个点到其指定中心的距离平方和:
model = KMeans(random_state=42)
elb_visualizer = KElbowVisualizer(model, k=(2,11))
elb_visualizer.fit(X)
elb_visualizer.show()
现在,我们已经有了一个 KMeans 聚类的失真分数弯头 带有垂直线标记的绘图,这将是最佳的 ks 数,在这种情况下, 4
.
如果我们不知道集群的实际数量,那么带有失真度量的肘部方法似乎不是最佳选择。 剪影是否也会表明有 4 个集群? 要回答这个问题,我们只需要使用具有 4 个集群和不同可视化对象的模型重复最后一个代码:
model_4clust = KMeans(n_clusters = 4, random_state=42)
sil_visualizer = SilhouetteVisualizer(model_4clust)
sil_visualizer.fit(X)
sil_visualizer.show()
代码显示一个 150个中心4个样本的KMeans聚类轮廓图. 要分析这个聚类,我们需要查看轮廓系数(或分数)的值,它的最佳值更接近 1。我们得到的平均值是 0.5
,由垂直线标记,并不太好。
我们还需要查看集群之间的分布——一个好的图具有相似大小的集群区域或分布良好的点。 在此图中,有 3 个较小的集群(编号 3、2、1)和一个较大的集群(编号 0),这不是我们预期的结果。
查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!
让我们对 3 个集群重复相同的图,看看会发生什么:
model_3clust = KMeans(n_clusters = 3, random_state=42)
sil_visualizer = SilhouetteVisualizer(model_3clust)
sil_visualizer.fit(X)
sil_visualizer.show()
通过改变簇的数量,轮廓得分得到 0.05
更高,集群更平衡。 如果我们不知道集群的实际数量,通过试验和结合这两种技术,我们会选择 3
而不是 2
作为Ks的数量。
这是一个示例,如何组合和比较不同的指标、可视化数据以及尝试不同的集群值对于将结果引导到正确的方向非常重要。 而且,拥有一个有助于分析的库如何在这个过程中有所帮助!