k-means 算法
把相似的数据汇总为簇的方法叫作聚类。
k-means 算法是一种聚类算法,该算法非常简单,所以被广泛应用于数据分析。
概述
k-means 算法是一种有代表性的聚类算法。由于该算法简单易懂,又可以用于比较大的数据集,所以在市场分析和计算机视觉等领域得到了广泛的应用。
我们来看一下 k-means 算法是如何进行聚类的。例如,将 k-means 算法应用于人工数据集,并把各个数据点分为 3 个簇,如图 3-17 所示。图 3-17b 中的×表示的点是各个簇的重心,是 k-means 算法中簇的代表点。
▲图 3-17 对二维数据 (a) 应用 k-means 算法的结果 (b)
通过计算数据点与各重心的距离,找出离得最近的簇的重心,可以确定数据点所属的簇。求簇的重心是 k-means 算法中重要的计算。
算法说明
k-means 算法的典型计算步骤如下(图 3-18)。
- 从数据点中随机选择数量与簇的数量相同的数据点,作为这些簇的重心。
- 计算数据点与各重心之间的距离,并将最近的重心所在的簇作为该数据点所属的簇。
- 计算每个簇的数据点的平均值,并将其作为新的重心。
- 重复步骤 2 和步骤 3,继续计算,直到所有数据点不改变所属的簇,或者达到最大计算步数。
▲图 3-18 [插图] 算法的计算步骤
步骤 1 中的簇的数量是一个超参数,需要在训练时设置。对于有些数据集,我们可能很难决定要设置的簇的数量,在这种情况下,可以使用“详细说明”部分介绍的 Elbow 方法(肘方法)等技巧。
另外,有时选择的重心不好可能会导致步骤 2 和步骤 3 的训练无法顺利进行。比如在随机选择的重心之间太近等的情况下,就会出现这种问题。利用 等方法,选择位置尽可能远离的数据点作为重心的初始值,就可以解决这个问题。
示例代码
下面是对鸢尾花数据集应用 k-means 算法的代码,簇的数量设置为 3。
▼示例代码
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
data = load_iris()
n_clusters = 3 # 将簇的数量设置为3
model = KMeans(n_clusters=n_clusters)
model.fit(data.data)
print(model.labels_) # 各数据点所属的簇
print(model.cluster_centers_) # 通过fit()计算的得到的重心
结果:
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 2 2 0 2 2 2 2 2 2 0 0 2 2 2 2 0 2 0 2 0 2 2 0 0 2 2 2 2 2 0 2 2 2 2 0 2 2 2 0 2 2 2 0 2 2 0] [[5.9016129 2.7483871 4.39354839 1.43387097] [5.006 3.428 1.462 0.246 ] [6.85 3.07368421 5.74210526 2.07105263]]
详细说明
聚类结果的评估方法
“算法说明”部分介绍了重心的更新方法。
下面介绍 k-means 算法的评估方法,即如何判断聚类结果是好是坏。图 3-19 所示为对同一个数据集多次应用 k-means 算法的结果。
▲图 3-19 对同一个数据集应用 k-means 算法的结果
图 3-19a 给人的印象是数据集划分得比较好,每个簇的区域清楚地分开了。不过从图形给人的印象来判断分析结果是一种定性的判断。另外,对于高维空间的数据,有可能难以进行可视化判断。因此,我们需要某种用于评估聚类结果是好是坏的定量的标准。
聚类结果的好坏可以通过计算簇内平方和(Within-Cluster Sum of Squares,WCSS)来定量评估(这个 WCSS 随着簇的数量的增加而变小,所以可以用于相同数量的簇的情况下的比较)。
WCSS 指的是对所有簇计算其所属的数据点与簇的重心之间距离的平方和,并将它们相加得到的值。这个值越小,说明聚类结果越好。
簇的重心与簇所属的数据点之间的距离越小,即数据点越在靠近簇的重心的地方集聚,WCSS 越小。
图 3-19a 的 WCSS 为 50.1,图 3-19b 的 WCSS 为 124.5,因此可以得出左图的聚类结果更好的结论。
使用 Elbow 方法确定簇的数量
在使用 k-means 算法时,首先要确定的就是簇的数量这个超参数,但有时我们并不知道应该将簇的值设置为多少合适。确定合理的簇的数量的一个方法是 Elbow 方法。我们已经知道,随着簇的数量增加,WCSS 会变小,但有时 WCSS 的变小幅度会从簇的数量为某个值时开始放缓。
在图 3-20 中,在簇的数量增加到 3 的过程中,WCSS 明显变小,但当簇的数量逐渐增加为 4、5……时,可以看到 WCSS 变小的幅度变缓了。Elbow 方法将图形中看起来像手臂弯曲时的肘部的点作为簇的数量。在这个例子中,我们将簇的数量设置为 3 似乎很合适。
▲图 3-20 基于 Elbow 方法确定簇的数量
当没有很明确的理由来确定簇的数量或对数据知之甚少时,Elbow 方法很有用。不过在实际的分析中,常常不会出现图中那样明显的“肘部”,所以 Elbow 方法的结果只不过是一种参考而已。
———————————————————————————————————————————
文章来源:书籍《图解机器学习算法》
作者:秋庭伸也 杉山阿圣 寺田学
出版社:人民邮电出版社
ISBN:9787115563569
本篇文章仅用于学习和研究目的,不会用于任何商业用途。引用书籍《图解机器学习算法》的内容旨在分享知识和启发思考,尊重原著作者秋庭伸也 杉山阿圣 寺田学的知识产权。如有侵权或者版权纠纷,请及时联系作者。
———————————————————————————————————————————