• [无监督学习] 14.详细图解k-means 算法


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

    1. 从数据点中随机选择数量与簇的数量相同的数据点,作为这些簇的重心。
    2. 计算数据点与各重心之间的距离,并将最近的重心所在的簇作为该数据点所属的簇。
    3. 计算每个簇的数据点的平均值,并将其作为新的重心。
    4. 重复步骤 2 和步骤 3,继续计算,直到所有数据点不改变所属的簇,或者达到最大计算步数。


    ▲图 3-18 [插图] 算法的计算步骤


    步骤 1 中的簇的数量是一个超参数,需要在训练时设置。对于有些数据集,我们可能很难决定要设置的簇的数量,在这种情况下,可以使用“详细说明”部分介绍的 Elbow 方法(肘方法)等技巧。
    另外,有时选择的重心不好可能会导致步骤 2 和步骤 3 的训练无法顺利进行。比如在随机选择的重心之间太近等的情况下,就会出现这种问题。利用  等方法,选择位置尽可能远离的数据点作为重心的初始值,就可以解决这个问题。
    示例代码
    下面是对鸢尾花数据集应用 k-means 算法的代码,簇的数量设置为 3。
    ▼示例代码

    1. from sklearn.cluster import KMeans
    2. from sklearn.datasets import load_iris
    3. data = load_iris()
    4. n_clusters = 3 # 将簇的数量设置为3
    5. model = KMeans(n_clusters=n_clusters)
    6. model.fit(data.data)
    7. print(model.labels_) # 各数据点所属的簇
    8. 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

    本篇文章仅用于学习和研究目的,不会用于任何商业用途。引用书籍《图解机器学习算法》的内容旨在分享知识和启发思考,尊重原著作者秋庭伸也 杉山阿圣 寺田学的知识产权。如有侵权或者版权纠纷,请及时联系作者。
    ———————————————————————————————————————————

  • 相关阅读:
    C primer plus学习笔记 —— 3、字符的IO(输入/输出)
    联盟 | 彩漩 X HelpLook,AI技术赋能企业效率提升
    android 11安装apk自动获取权限
    java最强本地缓存-Caffeine
    hadoop集群安装(四):安装hadoop集群
    promise详解
    milvus 迅速搭建
    2023计算机毕业设计SSM最新选题之java中药城药材销售管理系统eah41
    python数据处理作业4:使用numpy数组对象,随机创建4*4的矩阵,并提取其对角元素
    博士生研究(一)怎么选题
  • 原文地址:https://blog.csdn.net/jhghuhbb/article/details/139411333